From 19a0803a1d6cbdbdf23936c9a62e18d8fb659488 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Thu, 18 Mar 2021 14:56:33 +0100 Subject: [PATCH 0001/3032] Updated links style --- app/styles/patterns/global.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/styles/patterns/global.css b/app/styles/patterns/global.css index eeeeb27ff4..2366525ecf 100644 --- a/app/styles/patterns/global.css +++ b/app/styles/patterns/global.css @@ -402,7 +402,7 @@ mark { } a { - color: var(--blue); + color: var(--green-d1); text-decoration: none; transition: background 0.3s, color 0.3s; } From 9277e57f824952c81dbffaf6092679e4dcdc1c2a Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Thu, 18 Mar 2021 15:14:23 +0100 Subject: [PATCH 0002/3032] Fixed Safari bug social previews icon height --- app/styles/layouts/post-preview.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/styles/layouts/post-preview.css b/app/styles/layouts/post-preview.css index 80605960c7..b5a29081d7 100644 --- a/app/styles/layouts/post-preview.css +++ b/app/styles/layouts/post-preview.css @@ -382,7 +382,7 @@ .gh-social-og-likes svg { width: 20px; - height: auto; + height: 20px; } .gh-social-og-comments { @@ -488,6 +488,7 @@ .gh-social-twitter-preview-meta { display: flex; + align-items: center; overflow: hidden; overflow-wrap: break-word; width: 487px; @@ -511,7 +512,7 @@ .gh-social-twitter-preview-meta svg { width: 16px; - height: auto; + height: 16px; margin-right: 2px; } From ac4800e225ee18a217575e8010f81e6e827a25ee Mon Sep 17 00:00:00 2001 From: Fabien 'egg' O'Carroll Date: Thu, 18 Mar 2021 14:45:29 +0000 Subject: [PATCH 0003/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20deleting=20mem?= =?UTF-8?q?bers=20to=20prompt=20cancellation=20(#1869)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://github.com/TryGhost/Team/issues/546 Since https://github.com/TryGhost/Ghost/commit/26ee6483 and https://github.com/TryGhost/Admin/commit/723269bc member subscriptions have not been on the `stripe` property. This meant that all members were considered to not have subscriptions, and so the modal would not display to option to cancel subscriptions. --- app/components/modal-delete-member.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/modal-delete-member.js b/app/components/modal-delete-member.js index 50e3b4d9d2..bcf7ce71b6 100644 --- a/app/components/modal-delete-member.js +++ b/app/components/modal-delete-member.js @@ -18,7 +18,7 @@ export default ModalComponent.extend({ cancelSubscriptions: reads('shouldCancelSubscriptions'), hasActiveStripeSubscriptions: computed('member', function () { - let subscriptions = this.member.get('stripe'); + let subscriptions = this.member.get('subscriptions'); if (!subscriptions || subscriptions.length === 0) { return false; From 35e69e5459d8beff78aff9bf8f999f6a62a0dbd6 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 18 Mar 2021 16:46:38 +0000 Subject: [PATCH 0004/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20link=20contras?= =?UTF-8?q?t=20in=20editor=20with=20very=20light/dark=20accent=20colors=20?= =?UTF-8?q?(#1870)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Team/issues/551 refs https://github.com/TryGhost/Ghost/issues/12767#issuecomment-800177254 - calculate contrast color of accent color against light/dark mode background color - lighten (dark mode) or darken (light mode) the accent color used in the editor to ensure it has enough contrast to be legible --- app/controllers/application.js | 36 ++++++++ app/templates/application.hbs | 4 +- app/utils/color.js | 152 +++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 app/utils/color.js diff --git a/app/controllers/application.js b/app/controllers/application.js index 748dcaa490..fe0dae54a2 100644 --- a/app/controllers/application.js +++ b/app/controllers/application.js @@ -1,6 +1,13 @@ /* eslint-disable ghost/ember/alias-model-in-controller */ import Controller from '@ember/controller'; import {computed} from '@ember/object'; +import { + contrast, + darkenToContrastThreshold, + hexToRgb, + lightenToContrastThreshold, + rgbToHex +} from 'ghost-admin/utils/color'; import {inject as service} from '@ember/service'; export default Controller.extend({ @@ -8,6 +15,7 @@ export default Controller.extend({ customViews: service(), config: service(), dropdown: service(), + feature: service(), router: service(), session: service(), settings: service(), @@ -30,5 +38,33 @@ export default Controller.extend({ return (router.currentRouteName !== 'error404' || session.isAuthenticated) && !router.currentRouteName.match(/(signin|signup|setup|reset)/); + }), + + adjustedAccentColor: computed('settings.accentColor', 'feature.nightShift', function () { + const accentColor = this.settings.get('accentColor'); + const nightShift = this.feature.get('nightShift'); + // hardcoded background colors because + // grabbing color from .gh-main with getComputedStyle always returns #ffffff + const backgroundColor = nightShift ? '#151719' : '#ffffff'; + + const accentRgb = hexToRgb(accentColor); + const backgroundRgb = hexToRgb(backgroundColor); + + // WCAG contrast. 1 = lowest contrast, 21 = highest contrast + const accentContrast = contrast(backgroundRgb, accentRgb); + + if (accentContrast > 2) { + return accentColor; + } + + let adjustedAccentRgb = accentRgb; + + if (nightShift) { + adjustedAccentRgb = lightenToContrastThreshold(accentRgb, backgroundRgb, 2); + } else { + adjustedAccentRgb = darkenToContrastThreshold(accentRgb, backgroundRgb, 2); + } + + return rgbToHex(adjustedAccentRgb); }) }); diff --git a/app/templates/application.hbs b/app/templates/application.hbs index 562bf23c61..ce473063ff 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -37,10 +37,10 @@ {{#if this.settings.accentColor}} {{/if}} diff --git a/app/utils/color.js b/app/utils/color.js new file mode 100644 index 0000000000..5a25913875 --- /dev/null +++ b/app/utils/color.js @@ -0,0 +1,152 @@ +export function hexToRgb(hex) { + const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + hex = hex.replace(shorthandRegex, function (m, r, g, b) { + return r + r + g + g + b + b; + }); + + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; +} + +export function rgbToHex({r, g, b}) { + function hex(x) { + return ('0' + parseInt(x).toString(16)).slice(-2); + } + return '#' + hex(r) + hex(g) + hex(b); +} + +// returns {h,s,l} with range [0,1] for maximum precision in conversion +export function rgbToHsl({r, g, b}) { + r = r / 255; + g = g / 255; + b = b / 255; + + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + + let h = 0; + let s = 0; + const l = (max + min) / 2; + + if (max === min) { + h = s = 0; // achromatic + } else { + const delta = max - min; + + s = l > 0.5 + ? delta / (2 - max - min) + : delta / (max + min); + + switch (max) { + case r: h = (g - b) / delta + (g < b ? 6 : 0); break; + case g: h = (b - r) / delta + 2; break; + case b: h = (r - g) / delta + 4; break; + } + + h = h / 6; + } + + return {h, s, l}; +} + +// expects {h,s,l} in range [0,1], returns {r,g,b} in the range [0,255] +export function hslToRgb({h, s, l}) { + let r, g, b; + + function hue2rgb(p, q, t) { + if (t < 0) { + t += 1; + } + if (t > 1) { + t -= 1; + } + if (t < 1 / 6) { + return p + (q - p) * 6 * t; + } + if (t < 1 / 2) { + return q; + } + if (t < 2 / 3) { + return p + (q - p) * (2 / 3 - t) * 6; + } + return p; + } + + if (s === 0) { + r = g = b = l; + } else { + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + + r = r * 255; + g = g * 255; + b = b * 255; + + return {r, g, b}; +} + +// https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef +export function luminance({r, g, b}) { + const a = [r, g, b].map(function (v) { + v = v / 255; + + return v <= 0.03928 + ? v / 12.92 + : Math.pow((v + 0.055) / 1.055, 2.4); + }); + + return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; +} + +// https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef +export function contrast(rgb1, rgb2) { + const lum1 = luminance(rgb1); + const lum2 = luminance(rgb2); + const brightest = Math.max(lum1, lum2); + const darkest = Math.min(lum1, lum2); + + return (brightest + 0.05) / (darkest + 0.05); +} + +export function lightenToContrastThreshold(foregroundRgb, backgroundRgb, contrastThreshold) { + let newRgb = foregroundRgb; + + while (contrast(newRgb, backgroundRgb) < contrastThreshold) { + let {h,s,l} = rgbToHsl(newRgb); + + if (l >= 1) { + break; + } + + l = Math.min(l + 0.05, 1); + newRgb = hslToRgb({h,s,l}); + } + + return newRgb; +} + +export function darkenToContrastThreshold(foregroundRgb, backgroundRgb, contrastThreshold) { + let newRgb = foregroundRgb; + + while (contrast(newRgb, backgroundRgb) < contrastThreshold) { + let {h,s,l} = rgbToHsl(newRgb); + + if (l <= 0) { + break; + } + + l = Math.max(l - 0.05, 0); + newRgb = hslToRgb({h,s,l}); + } + + return newRgb; +} From 3fd3e3dfe249a69c93be6f796f315b0ac9fd1f03 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 18 Mar 2021 18:26:35 +0100 Subject: [PATCH 0005/3032] New logo (#1868) refs TryGhost/Team#547 - Updated Admin to use new Ghost logo --- app/components/gh-browser-preview.hbs | 2 +- app/components/gh-nav-menu/main.hbs | 2 +- app/components/gh-nav-menu/main.js | 4 +++- app/controllers/signin.js | 2 +- app/styles/app-dark.css | 2 ++ app/styles/components/browser-preview.css | 14 +++++------- app/styles/layouts/apps.css | 17 ++++++++++++++ app/styles/layouts/main.css | 1 - app/templates/about.hbs | 2 +- app/templates/integrations/zapier.hbs | 18 +++++++-------- public/assets/icons/default-favicon.svg | 12 ++++++++++ public/assets/icons/ghost-logo-orb.svg | 10 +++++++++ public/assets/icons/ghost-orb.svg | 10 +++++++++ public/assets/icons/icon.svg | 21 +----------------- public/assets/img/favicon.ico | Bin 1004 -> 15406 bytes .../assets/img/logos/ghost-logo-black-1.png | Bin 0 -> 43049 bytes public/assets/img/logos/orb-black-1.png | Bin 0 -> 51786 bytes public/assets/img/logos/orb-black-2.png | Bin 0 -> 54957 bytes public/assets/img/logos/orb-black-3.png | Bin 0 -> 38508 bytes public/assets/img/logos/orb-black-4.png | Bin 0 -> 44536 bytes public/assets/img/logos/orb-black-5.png | Bin 0 -> 54359 bytes public/assets/img/orb-squircle.png | Bin 0 -> 14924 bytes 22 files changed, 73 insertions(+), 44 deletions(-) create mode 100644 public/assets/icons/default-favicon.svg create mode 100644 public/assets/icons/ghost-logo-orb.svg create mode 100644 public/assets/icons/ghost-orb.svg create mode 100644 public/assets/img/logos/ghost-logo-black-1.png create mode 100644 public/assets/img/logos/orb-black-1.png create mode 100644 public/assets/img/logos/orb-black-2.png create mode 100644 public/assets/img/logos/orb-black-3.png create mode 100644 public/assets/img/logos/orb-black-4.png create mode 100644 public/assets/img/logos/orb-black-5.png create mode 100644 public/assets/img/orb-squircle.png diff --git a/app/components/gh-browser-preview.hbs b/app/components/gh-browser-preview.hbs index 733e427194..5871713582 100644 --- a/app/components/gh-browser-preview.hbs +++ b/app/components/gh-browser-preview.hbs @@ -8,7 +8,7 @@ {{#if @icon}} icon {{else}} - {{svg-jar "icon"}} + {{svg-jar "default-favicon"}} {{/if}} {{@title}} diff --git a/app/components/gh-nav-menu/main.hbs b/app/components/gh-nav-menu/main.hbs index 93745ee8ff..da9a26daf7 100644 --- a/app/components/gh-nav-menu/main.hbs +++ b/app/components/gh-nav-menu/main.hbs @@ -1,6 +1,6 @@
-
+
{{this.config.blogTitle}}
+ + + diff --git a/app/components/modal-invite-new-user.js b/app/components/modal-invite-new-user.js index 692b8482c8..a2b177877d 100644 --- a/app/components/modal-invite-new-user.js +++ b/app/components/modal-invite-new-user.js @@ -9,14 +9,18 @@ import {task} from 'ember-concurrency'; const {Promise} = RSVP; export default ModalComponent.extend(ValidationEngine, { + router: service(), notifications: service(), store: service(), + limit: service(), classNames: 'modal-content invite-new-user', role: null, roles: null, + limitErrorMessage: null, + validationType: 'inviteUser', didInsertElement() { @@ -42,8 +46,28 @@ export default ModalComponent.extend(ValidationEngine, { const role = this.roles.findBy('name', roleName); this.set('role', role); this.errors.remove('role'); + this.validateRole(); }), + async validateRole() { + if (this.get('role.name') !== 'Contributor' + && this.limit.limiter && this.limit.limiter.isLimited('staff')) { + try { + await this.limit.limiter.errorIfWouldGoOverLimit('staff'); + + this.set('limitErrorMessage', null); + } catch (error) { + if (error.errorType === 'HostLimitError') { + this.set('limitErrorMessage', error.message); + } else { + this.notifications.showAPIError(error, {key: 'staff.limit'}); + } + } + } else { + this.set('limitErrorMessage', null); + } + }, + validate() { let email = this.email; @@ -123,5 +147,11 @@ export default ModalComponent.extend(ValidationEngine, { this.send('closeModal'); } } - }).drop() + }).drop(), + + transitionToBilling: task(function () { + this.router.transitionTo('pro'); + + this.send('closeModal'); + }) }); diff --git a/app/styles/layouts/users.css b/app/styles/layouts/users.css index b2cf9f759d..d20e797da3 100644 --- a/app/styles/layouts/users.css +++ b/app/styles/layouts/users.css @@ -240,7 +240,8 @@ white-space: nowrap; } -.invite-new-user .gh-btn-black { +.invite-new-user .gh-btn-black, +.invite-new-user .gh-btn-green { margin: 0; width: 100%; } From a364ee994a98e9d58fa1358f8d26e0f869403435 Mon Sep 17 00:00:00 2001 From: Naz Date: Thu, 8 Apr 2021 20:07:24 +1200 Subject: [PATCH 0045/3032] Fixed staff limit check query to take into account inactive users refs https://github.com/TryGhost/Team/issues/587 - Users with 'inactive' status should not be counted towards the "staff" limit --- app/services/limit.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/services/limit.js b/app/services/limit.js index 2412bb1390..6f940a4cf0 100644 --- a/app/services/limit.js +++ b/app/services/limit.js @@ -74,7 +74,9 @@ export default class LimitsService extends Service { users: this.store.findAll('user', {reload: true}), invites: this.store.findAll('invite', {reload: true}) }).then((data) => { - return data.users.length + data.invites.length; + const activeUsers = data.users.filter(u => u.status !== 'inactive'); + + return activeUsers.length + data.invites.length; }); } From f5fc55961a292f06460ff58257138997a2ae3c9a Mon Sep 17 00:00:00 2001 From: Thibaut Patel Date: Thu, 8 Apr 2021 10:56:00 +0200 Subject: [PATCH 0046/3032] Replaced the config service by the limiter service comment https://github.com/TryGhost/Admin/commit/16debb75a994f16ff5079f2f2896ed9958e4cbbe#r49241858 --- app/controllers/settings/theme/uploadtheme.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/settings/theme/uploadtheme.js b/app/controllers/settings/theme/uploadtheme.js index 478cfc399a..3e8889fd55 100644 --- a/app/controllers/settings/theme/uploadtheme.js +++ b/app/controllers/settings/theme/uploadtheme.js @@ -2,9 +2,9 @@ import Controller from '@ember/controller'; import {inject as service} from '@ember/service'; export default class UploadThemeController extends Controller { - @service config; + @service limit; get isAllowed() { - return !this.config.get('hostSettings')?.limits?.customThemes; + return !this.limit.limiter.isLimited('customThemes'); } } From 66aa1cfcd267b0029816b1f0c72dad3d38326782 Mon Sep 17 00:00:00 2001 From: Naz Date: Thu, 8 Apr 2021 21:10:59 +1200 Subject: [PATCH 0047/3032] Fixed staff limit check to filter out "Contributors" refs https://github.com/TryGhost/Team/issues/587 - Invites and users with "Contributor" roles should not be counted towards the limit --- app/services/limit.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/services/limit.js b/app/services/limit.js index 6f940a4cf0..46a9be9ed8 100644 --- a/app/services/limit.js +++ b/app/services/limit.js @@ -74,9 +74,10 @@ export default class LimitsService extends Service { users: this.store.findAll('user', {reload: true}), invites: this.store.findAll('invite', {reload: true}) }).then((data) => { - const activeUsers = data.users.filter(u => u.status !== 'inactive'); + const staffUsers = data.users.filter(u => u.get('status') !== 'inactive' && u.role.get('name') !== 'Contributor'); + const staffInvites = data.invites.filter(i => i.role.get('name') !== 'Contributor'); - return activeUsers.length + data.invites.length; + return staffUsers.length + staffInvites.length; }); } From ce79589753d998e924abdad30e13772b4a300bcd Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Thu, 8 Apr 2021 11:53:15 +0200 Subject: [PATCH 0048/3032] Styled staff limit notification in invite-modal --- app/components/modal-invite-new-user.hbs | 4 ++-- app/styles/patterns/boxes.css | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/components/modal-invite-new-user.hbs b/app/components/modal-invite-new-user.hbs index 80651e80f0..7dba0ad557 100644 --- a/app/components/modal-invite-new-user.hbs +++ b/app/components/modal-invite-new-user.hbs @@ -176,9 +176,9 @@ - diff --git a/app/styles/patterns/boxes.css b/app/styles/patterns/boxes.css index affcac997e..40f06cf203 100644 --- a/app/styles/patterns/boxes.css +++ b/app/styles/patterns/boxes.css @@ -53,13 +53,14 @@ } .gh-content-box { + line-height: 1.4em; border: none; background: var(--main-color-content-greybg); border-radius: 3px; } -.gh-content-box.pa { padding: 24px; } -.gh-content-box.pt { padding-top: 24px; } -.gh-content-box.pr { padding-right: 24px; } -.gh-content-box.pb { padding-bottom: 24px; } -.gh-content-box.pl { padding-left: 24px; } \ No newline at end of file +.gh-content-box.pa { padding: 16px; } +.gh-content-box.pt { padding-top: 16px; } +.gh-content-box.pr { padding-right: 16px; } +.gh-content-box.pb { padding-bottom: 16px; } +.gh-content-box.pl { padding-left: 16px; } \ No newline at end of file From 605ca321c8d1286b3f670380fa3b0cdbf7498e9c Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 8 Apr 2021 12:06:27 +0100 Subject: [PATCH 0049/3032] =?UTF-8?q?=E2=9C=A8=20Added=20ability=20to=20bu?= =?UTF-8?q?lk=20delete=20members=20by=20label=20or=20status=20(#1883)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Team/issues/585 requires https://github.com/TryGhost/Ghost/pull/12082 When a label or status filter is selected on the members screen show a "Delete selected" option in the actions dropdown. Bulk deleted members will _not_ have any subscription data modified in Stripe, if a member should be deleted and have their subscription cancelled it's necessary to do that on a per-member basis. - updated bulk delete handling to match API - added link to bulk delete confirmation modal in members actions dropdown (only shown when label, status, or search is used) - updated testing framework for members - added label factory for easier test setup - updated `GET /members` and `DEL /members` endpoints to work with label filters - updated test selectors for easier reference in tests --- app/components/gh-members-filter.hbs | 8 ++-- app/components/gh-members-list-item.hbs | 2 +- app/components/modal-delete-members.hbs | 17 ++++---- app/components/modal-delete-members.js | 2 +- app/controllers/members.js | 16 +++++-- app/templates/members.hbs | 23 +++++++--- mirage/config/members.js | 56 +++++++++++++++++++++---- mirage/config/posts.js | 34 +-------------- mirage/factories/label.js | 15 +++++++ mirage/factories/member.js | 18 +++++++- mirage/models/label.js | 5 +++ mirage/models/member.js | 3 +- mirage/serializers/label.js | 18 ++++++++ mirage/utils.js | 51 ++++++++++++++++++++++ tests/acceptance/members-test.js | 45 ++++++++++++++++++++ 15 files changed, 245 insertions(+), 68 deletions(-) create mode 100644 mirage/factories/label.js create mode 100644 mirage/models/label.js create mode 100644 mirage/serializers/label.js diff --git a/app/components/gh-members-filter.hbs b/app/components/gh-members-filter.hbs index be306abd5a..9a70562c9e 100644 --- a/app/components/gh-members-filter.hbs +++ b/app/components/gh-members-filter.hbs @@ -2,8 +2,10 @@ + @classNames="gh-contentfilter-menu-trigger" + @title="Member Labels" + data-test-button="labels-filter" + > {{@selectedLabel.name}} {{svg-jar "arrow-down-small"}} @@ -19,7 +21,7 @@ {{#each @availableLabels as |label|}}
  • - {{label.name}} + {{label.name}} {{#if label.slug}} {{svg-jar "pen"}} {{/if}} diff --git a/app/components/gh-members-list-item.hbs b/app/components/gh-members-list-item.hbs index 9d4cc52fc5..d38435c363 100644 --- a/app/components/gh-members-list-item.hbs +++ b/app/components/gh-members-list-item.hbs @@ -1,4 +1,4 @@ -
  • +
  • {{#if @member.is_loading}}
    diff --git a/app/components/modal-delete-members.hbs b/app/components/modal-delete-members.hbs index d3a65647fd..b59d8662ec 100644 --- a/app/components/modal-delete-members.hbs +++ b/app/components/modal-delete-members.hbs @@ -1,5 +1,5 @@
    {{svg-jar "close"}} @@ -8,7 +8,7 @@

    You're about to delete {{gh-pluralize this.model.memberCount "member"}}. - This is permanent! We warned you, k? + This is permanent! All Ghost data will be deleted, this will have no effect on subscriptions in Stripe.

    {{else}} @@ -26,21 +26,18 @@
    {{svg-jar "check-circle" class="w4 h4 stroke-green mr2"}}

    - {{gh-pluralize this.response.deleted.count "member"}} + {{gh-pluralize this.response.stats.successful "member"}} deleted

    - {{#if this.response.invalid.count}} + {{#if this.response.stats.unsuccessful}}
    {{svg-jar "warning" class="w4 h4 fill-red mr2 nudge-top--3"}}

    - {{gh-pluralize this.response.invalid.count "member"}} - skipped + {{gh-pluralize this.response.stats.unsuccessful "member"}} + failed to delete

    - {{#each this.response.invalid.errors as |error|}} -

    {{error.message}} {{error.count}}

    - {{/each}}
    {{/if}} @@ -55,7 +52,7 @@ - + {{svg-jar "settings"}} - +
  • Import members @@ -58,6 +64,13 @@ {{/if}}
  • + {{#if (and this.members.length this.isFiltered)}} +
  • + +
  • + {{/if}} New member diff --git a/mirage/config/members.js b/mirage/config/members.js index 1fc7806ddb..8fdf0c5544 100644 --- a/mirage/config/members.js +++ b/mirage/config/members.js @@ -1,7 +1,8 @@ import faker from 'faker'; import moment from 'moment'; import {Response} from 'ember-cli-mirage'; -import {paginatedResponse} from '../utils'; +import {extractFilterParam, paginateModelCollection} from '../utils'; +import {isEmpty} from '@ember/utils'; export function mockMembersStats(server) { server.get('/members/stats/count', function (db, {queryParams}) { @@ -66,25 +67,64 @@ export default function mockMembers(server) { return members.create(Object.assign({}, attrs, {id: 99})); }); - server.get('/members/', paginatedResponse('members')); + server.get('/members/', function ({members}, {queryParams}) { + let {filter, page, limit} = queryParams; + + page = +page || 1; + limit = +limit || 15; + + let labelFilter = extractFilterParam('label', filter); + + let collection = members.all().filter((member) => { + let matchesLabel = true; + + if (!isEmpty(labelFilter)) { + matchesLabel = false; + + labelFilter.forEach((slug) => { + if (member.labels.models.find(l => l.slug === slug)) { + matchesLabel = true; + } + }); + } + + return matchesLabel; + }); + + return paginateModelCollection('members', collection, page, limit); + }); server.del('/members/', function ({members}, {queryParams}) { - if (queryParams.all !== 'true') { + if (!queryParams.filter && !queryParams.search && queryParams.all !== 'true') { return new Response(422, {}, {errors: [{ type: 'IncorrectUsageError', message: 'DELETE /members/ must be used with a filter, search, or all=true query parameter' }]}); } - let count = members.all().length; - members.all().destroy(); + let membersToDelete = members.all(); + + if (queryParams.filter) { + let labelFilter = extractFilterParam('label', queryParams.filter); + + membersToDelete = membersToDelete.filter((member) => { + let matches = false; + labelFilter.forEach((slug) => { + if (member.labels.models.find(l => l.slug === slug)) { + matches = true; + } + }); + return matches; + }); + } + + let count = membersToDelete.length; + membersToDelete.destroy(); return { meta: { stats: { - deleted: { - count - } + successful: count } } }; diff --git a/mirage/config/posts.js b/mirage/config/posts.js index dc6f827287..d3ad6dcc6e 100644 --- a/mirage/config/posts.js +++ b/mirage/config/posts.js @@ -1,40 +1,8 @@ import moment from 'moment'; import {Response} from 'ember-cli-mirage'; import {dasherize} from '@ember/string'; -import {isArray} from '@ember/array'; +import {extractFilterParam, paginateModelCollection} from '../utils'; import {isBlank, isEmpty} from '@ember/utils'; -import {paginateModelCollection} from '../utils'; - -function normalizeBooleanParams(arr) { - if (!isArray(arr)) { - return arr; - } - - return arr.map((i) => { - if (i === 'true') { - return true; - } else if (i === 'false') { - return false; - } else { - return i; - } - }); -} - -// TODO: use GQL to parse filter string? -function extractFilterParam(param, filter) { - let filterRegex = new RegExp(`${param}:(.*?)(?:\\+|$)`); - let match; - - let [, result] = filter.match(filterRegex) || []; - if (result.startsWith('[')) { - match = result.replace(/^\[|\]$/g, '').split(','); - } else if (result) { - match = [result]; - } - - return normalizeBooleanParams(match); -} // NOTE: mirage requires Model objects when saving relationships, however the // `attrs` on POST/PUT requests will contain POJOs for authors and tags so we diff --git a/mirage/factories/label.js b/mirage/factories/label.js new file mode 100644 index 0000000000..5dbf7840a2 --- /dev/null +++ b/mirage/factories/label.js @@ -0,0 +1,15 @@ +import moment from 'moment'; +import {Factory} from 'ember-cli-mirage'; + +export default Factory.extend({ + createdAt() { return moment().toISOString(); }, + createdBy: 1, + name(i) { return `Label ${i}`; }, + slug(i) { return `label-${i}`; }, + updatedAt() { return moment().toISOString(); }, + updatedBy: 1, + count() { + // this gets updated automatically by the label serializer + return {members: 0}; + } +}); diff --git a/mirage/factories/member.js b/mirage/factories/member.js index b2ebbe2eaa..e0e37202c6 100644 --- a/mirage/factories/member.js +++ b/mirage/factories/member.js @@ -1,6 +1,6 @@ import faker from 'faker'; import moment from 'moment'; -import {Factory} from 'ember-cli-mirage'; +import {Factory, trait} from 'ember-cli-mirage'; let randomDate = function randomDate(start = moment().subtract(30, 'days').toDate(), end = new Date()) { return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())); @@ -9,5 +9,19 @@ let randomDate = function randomDate(start = moment().subtract(30, 'days').toDat export default Factory.extend({ name() { return `${faker.name.firstName()} ${faker.name.lastName()}`; }, email: faker.internet.email, - createdAt() { return randomDate(); } + status: 'free', + subscribed: true, + createdAt() { return randomDate(); }, + + free: trait({ + status: 'free' + }), + + paid: trait({ + status: 'paid' + }), + + comped: trait({ + status: 'comped' + }) }); diff --git a/mirage/models/label.js b/mirage/models/label.js new file mode 100644 index 0000000000..1466b9ea45 --- /dev/null +++ b/mirage/models/label.js @@ -0,0 +1,5 @@ +import {Model, hasMany} from 'ember-cli-mirage'; + +export default Model.extend({ + members: hasMany() +}); diff --git a/mirage/models/member.js b/mirage/models/member.js index 6bfe517e93..f97e3b4248 100644 --- a/mirage/models/member.js +++ b/mirage/models/member.js @@ -1,4 +1,5 @@ -import {Model} from 'ember-cli-mirage'; +import {Model, hasMany} from 'ember-cli-mirage'; export default Model.extend({ + labels: hasMany() }); diff --git a/mirage/serializers/label.js b/mirage/serializers/label.js new file mode 100644 index 0000000000..dc3b9d7ab7 --- /dev/null +++ b/mirage/serializers/label.js @@ -0,0 +1,18 @@ +import BaseSerializer from './application'; + +export default BaseSerializer.extend({ + // make the label.count.members value dynamic + serialize(labelModelOrCollection, request) { + let updateMemberCount = (label) => { + label.update('count', {members: label.memberIds.length}); + }; + + if (this.isModel(labelModelOrCollection)) { + updateMemberCount(labelModelOrCollection); + } else { + labelModelOrCollection.models.forEach(updateMemberCount); + } + + return BaseSerializer.prototype.serialize.call(this, labelModelOrCollection, request); + } +}); diff --git a/mirage/utils.js b/mirage/utils.js index 57e82d3904..c615336bb7 100644 --- a/mirage/utils.js +++ b/mirage/utils.js @@ -1,5 +1,6 @@ /* eslint-disable max-statements-per-line */ import {Response} from 'ember-cli-mirage'; +import {isArray} from '@ember/array'; export function paginatedResponse(modelName) { return function (schema, request) { @@ -71,3 +72,53 @@ export function versionMismatchResponse() { }] }); } + +function normalizeBooleanParams(arr) { + if (!isArray(arr)) { + return arr; + } + + return arr.map((i) => { + if (i === 'true') { + return true; + } else if (i === 'false') { + return false; + } else { + return i; + } + }); +} + +function normalizeStringParams(arr) { + if (!isArray(arr)) { + return arr; + } + + return arr.map((i) => { + if (!i.replace) { + return i; + } + + return i.replace(/^['"]|['"]$/g, ''); + }); +} + +// TODO: use GQL to parse filter string? +export function extractFilterParam(param, filter) { + let filterRegex = new RegExp(`${param}:(.*?)(?:\\+|$)`); + let match; + + let [, result] = filter.match(filterRegex) || []; + + if (!result) { + return; + } + + if (result.startsWith('[')) { + match = result.replace(/^\[|\]$/g, '').split(','); + } else { + match = [result]; + } + + return normalizeBooleanParams(normalizeStringParams(match)); +} diff --git a/tests/acceptance/members-test.js b/tests/acceptance/members-test.js index 6cc048dfbe..da6b764624 100644 --- a/tests/acceptance/members-test.js +++ b/tests/acceptance/members-test.js @@ -145,5 +145,50 @@ describe('Acceptance: Members', function () { expect(find('[data-test-input="member-email"]').value, 'email has been preserved') .to.equal('example@domain.com'); }); + + it('can bulk delete members', async function () { + // members to be kept + this.server.createList('member', 6); + + // imported members to be deleted + const label = this.server.create('label'); + this.server.createList('member', 5, {labels: [label]}); + + await visit('/members'); + + expect(findAll('[data-test-member]').length).to.equal(11); + + await click('[data-test-button="members-actions"]'); + + expect(find('[data-test-button="delete-selected"]')).to.not.exist; + + // a filter is needed for the delete-selected button to show + await click('[data-test-button="labels-filter"]'); + await click(`[data-test-label-filter="${label.name}"]`); + + expect(findAll('[data-test-member]').length).to.equal(5); + expect(currentURL()).to.equal('/members?label=label-0'); + + await click('[data-test-button="members-actions"]'); + + expect(find('[data-test-button="delete-selected"]')).to.exist; + + await click('[data-test-button="delete-selected"]'); + + expect(find('[data-test-modal="delete-members"]')).to.exist; + expect(find('[data-test-text="delete-count"]')).to.have.text('5 members'); + + await click('[data-test-button="confirm"]'); + + expect(find('[data-test-text="deleted-count"]')).to.have.text('5 members'); + expect(find('[data-test-button="confirm"]')).to.not.exist; + // members filter is reset + // TODO: fix query params reset for empty strings + expect(currentURL()).to.equal('/members?search='); + + await click('[data-test-button="close-modal"]'); + + expect(find('[data-test-modal="delete-members"]')).to.not.exist; + }); }); }); From f552d096f5576d55aafe877979e41c30e67300a8 Mon Sep 17 00:00:00 2001 From: Thibaut Patel Date: Thu, 8 Apr 2021 13:53:52 +0200 Subject: [PATCH 0050/3032] Revert "Replaced the config service by the limiter service" This reverts commit f5fc55961a292f06460ff58257138997a2ae3c9a. --- app/controllers/settings/theme/uploadtheme.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/settings/theme/uploadtheme.js b/app/controllers/settings/theme/uploadtheme.js index 3e8889fd55..478cfc399a 100644 --- a/app/controllers/settings/theme/uploadtheme.js +++ b/app/controllers/settings/theme/uploadtheme.js @@ -2,9 +2,9 @@ import Controller from '@ember/controller'; import {inject as service} from '@ember/service'; export default class UploadThemeController extends Controller { - @service limit; + @service config; get isAllowed() { - return !this.limit.limiter.isLimited('customThemes'); + return !this.config.get('hostSettings')?.limits?.customThemes; } } From ecc05aa1343707658c3c0341d1276c11b41972b0 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 8 Apr 2021 14:38:42 +0200 Subject: [PATCH 0051/3032] Added static components for custom products - added link to Products in Settings main screen - added product list page with static content - added product detail page with static content --- app/controllers/settings/product.js | 37 ++++++++ app/controllers/settings/products.js | 3 + app/router.js | 5 ++ app/routes/settings/product.js | 22 +++++ app/routes/settings/products.js | 9 ++ app/styles/app-dark.css | 1 + app/styles/app.css | 1 + app/styles/layouts/main.css | 11 +++ app/styles/layouts/products.css | 83 ++++++++++++++++++ app/templates/settings.hbs | 9 +- app/templates/settings/product.hbs | 125 +++++++++++++++++++++++++++ app/templates/settings/products.hbs | 40 +++++++++ 12 files changed, 345 insertions(+), 1 deletion(-) create mode 100644 app/controllers/settings/product.js create mode 100644 app/controllers/settings/products.js create mode 100644 app/routes/settings/product.js create mode 100644 app/routes/settings/products.js create mode 100644 app/styles/layouts/products.css create mode 100644 app/templates/settings/product.hbs create mode 100644 app/templates/settings/products.hbs diff --git a/app/controllers/settings/product.js b/app/controllers/settings/product.js new file mode 100644 index 0000000000..3a80a394dd --- /dev/null +++ b/app/controllers/settings/product.js @@ -0,0 +1,37 @@ +import Controller from '@ember/controller'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; + +export default class ProductController extends Controller { + @service settings; + + @tracked showLeaveSettingsModal = false; + + leaveRoute(transition) { + if (this.settings.get('hasDirtyAttributes')) { + transition.abort(); + this.leaveSettingsTransition = transition; + this.showLeaveSettingsModal = true; + } + } + + @action + async confirmLeave() { + this.settings.rollbackAttributes(); + this.showLeaveSettingsModal = false; + this.leaveSettingsTransition.retry(); + } + + @action + cancelLeave() { + this.showLeaveSettingsModal = false; + this.leaveSettingsTransition = null; + } + + @task({drop: true}) + *saveTask() { + return yield this.settings.save(); + } +} diff --git a/app/controllers/settings/products.js b/app/controllers/settings/products.js new file mode 100644 index 0000000000..f8e81e3dff --- /dev/null +++ b/app/controllers/settings/products.js @@ -0,0 +1,3 @@ +import Controller from '@ember/controller'; + +export default class ProductsController extends Controller {} diff --git a/app/router.js b/app/router.js index b099228274..677e8b7f27 100644 --- a/app/router.js +++ b/app/router.js @@ -52,6 +52,11 @@ Router.map(function () { this.route('settings.members-email', {path: '/settings/members-email'}); this.route('settings.members-payments', {path: '/settings/members-payments'}); this.route('settings.code-injection', {path: '/settings/code-injection'}); + + this.route('settings.products', {path: '/settings/products'}); + this.route('settings.product', {path: '/settings/product'}); + this.route('settings.price', {path: '/settings/price'}); + this.route('settings.theme', {path: '/settings/theme'}, function () { this.route('uploadtheme'); this.route('install'); diff --git a/app/routes/settings/product.js b/app/routes/settings/product.js new file mode 100644 index 0000000000..56cc7b45b6 --- /dev/null +++ b/app/routes/settings/product.js @@ -0,0 +1,22 @@ +import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; +import {inject as service} from '@ember/service'; + +export default class ProductRoute extends AuthenticatedRoute { + @service settings; + + model() { + this.settings.reload(); + } + + actions = { + willTransition(transition) { + return this.controller.leaveRoute(transition); + } + } + + buildRouteInfoMetadata() { + return { + titleToken: 'Settings - Products' + }; + } +} diff --git a/app/routes/settings/products.js b/app/routes/settings/products.js new file mode 100644 index 0000000000..ea74f0fea4 --- /dev/null +++ b/app/routes/settings/products.js @@ -0,0 +1,9 @@ +import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; + +export default class ProductsRoute extends AuthenticatedRoute { + buildRouteInfoMetadata() { + return { + titleToken: 'Settings - Products' + }; + } +} diff --git a/app/styles/app-dark.css b/app/styles/app-dark.css index 6eb9956915..ef5a222017 100644 --- a/app/styles/app-dark.css +++ b/app/styles/app-dark.css @@ -66,6 +66,7 @@ @import "http://github.com/layouts/fullscreen-wizard.css"; @import "http://github.com/layouts/post-preview.css"; @import "http://github.com/layouts/dashboard.css"; +@import "http://github.com/layouts/products.css"; :root { diff --git a/app/styles/app.css b/app/styles/app.css index e912c1d343..09f89892b5 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -66,6 +66,7 @@ @import "http://github.com/layouts/fullscreen-wizard.css"; @import "http://github.com/layouts/post-preview.css"; @import "http://github.com/layouts/dashboard.css"; +@import "http://github.com/layouts/products.css"; /* ---------------------------✈️----------------------------- */ diff --git a/app/styles/layouts/main.css b/app/styles/layouts/main.css index df1a4cbfe2..5ece60d263 100644 --- a/app/styles/layouts/main.css +++ b/app/styles/layouts/main.css @@ -1108,6 +1108,10 @@ padding: 0; } +.gh-main-section-block.span-2 { + grid-column: span 2; +} + .gh-main-section-block.with-margin, .gh-main-section-block:not(:last-of-type) { margin-bottom: 32px; @@ -1135,6 +1139,12 @@ border-radius: 3px; } +.gh-main-section-content.bordered { + padding: 24px; + border: 1px solid var(--whitegrey); + border-radius: 3px; +} + .gh-main-section-content.columns-2 { grid-template-columns: 1fr 1fr; grid-column-gap: 40px; @@ -1145,6 +1155,7 @@ grid-column-gap: 24px; } + .gh-main-section-content.grey { background: var(--main-color-content-greybg); } diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css new file mode 100644 index 0000000000..e4c56b95ff --- /dev/null +++ b/app/styles/layouts/products.css @@ -0,0 +1,83 @@ +/* Product list */ +.gh-product-list-chevron { + padding-right: 0; +} + +.gh-product-chevron { + display: flex; + align-items: center; + justify-content: flex-end; + color: var(--midgrey); +} + +.gh-product-chevron span { + line-height: 0; +} + +/* Product details */ +.gh-product-details { + display: grid; + grid-template-columns: 2fr 1fr; + grid-gap: 32px; + margin-bottom: 3vw; +} + +.gh-product-details-form { + display: flex; + flex-grow: 1; + align-items: flex-start; + padding-top: 20px !important; +} + +.gh-product-icon-container { + width: unset; + padding-bottom: 0; + margin-bottom: 0; +} + +.gh-product-icon { + display: flex; + align-items: center; + justify-content: center; + background: var(--white); + width: 124px; + height: 124px; + margin-right: 24px; + border: 1px solid var(--whitegrey); + border-radius: 3px; +} + +.gh-product-details-fields { + width: 100%; +} + +.gh-product-description-container { + padding-bottom: 0; + margin-bottom: 0; +} + +.gh-product-details section { + display: flex; + flex-direction: column; + justify-content: stretch; +} + +.gh-product-stat-container { + display: flex; + flex-direction: column; + flex-grow: 1; + border: 1px solid var(--whitegrey); + padding: 24px; + border-radius: 3px; +} + +.gh-product-chart { + color: var(--whitegrey); + border: 1px solid var(--whitegrey); + border-top-color: transparent; + height: 90px; + display: flex; + align-items: center; + justify-content: center; + margin: 12px 0; +} \ No newline at end of file diff --git a/app/templates/settings.hbs b/app/templates/settings.hbs index feb2e28c6c..86aeb1df1b 100644 --- a/app/templates/settings.hbs +++ b/app/templates/settings.hbs @@ -48,9 +48,16 @@

    Configure members usage and default access levels

    + + {{svg-jar "module"}} +
    +

    Products

    +

    Set up subscription products and prices

    +
    +
    {{/if}} {{/if}} From 07abd8508ac516bcfc248fd6e17dca42ff91dbf6 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 8 Apr 2021 16:00:32 +0100 Subject: [PATCH 0054/3032] Fixed members list query not always matching route params refs https://github.com/TryGhost/Admin/commit/e46738dbf293b14568918db9bf3deb8dafc7f197 - referenced refactor accidentally removed direct usage of `params` in `fetchMembersTask()` - because it's called from the `model()` hook the query param properties on `this` have not yet been updated to the new params meaning we were querying the API with stale params --- app/controllers/members.js | 5 +++-- tests/acceptance/members-test.js | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/members.js b/app/controllers/members.js index 29e17008e7..c539cd9778 100644 --- a/app/controllers/members.js +++ b/app/controllers/members.js @@ -143,8 +143,8 @@ export default class MembersController extends Controller { return !!(this.label || this.paidParam || this.searchParam); } - getApiQueryObject({extraFilters = []} = {}) { - let {label, paidParam, searchParam} = this; + getApiQueryObject({params, extraFilters = []} = {}) { + let {label, paidParam, searchParam} = params ? params : this; let filters = []; @@ -301,6 +301,7 @@ export default class MembersController extends Controller { this.members = yield this.ellaSparse.array((range = {}, query = {}) => { const searchQuery = this.getApiQueryObject({ + params, extraFilters: [`created_at:<='${moment.utc(this._startDate).format('YYYY-MM-DD HH:mm:ss')}'`] }); const order = orderParam ? `${orderParam} desc` : `created_at desc`; diff --git a/tests/acceptance/members-test.js b/tests/acceptance/members-test.js index da6b764624..8e41128527 100644 --- a/tests/acceptance/members-test.js +++ b/tests/acceptance/members-test.js @@ -185,6 +185,7 @@ describe('Acceptance: Members', function () { // members filter is reset // TODO: fix query params reset for empty strings expect(currentURL()).to.equal('/members?search='); + expect(findAll('[data-test-member]').length).to.equal(6); await click('[data-test-button="close-modal"]'); From 2da9f187f9ea128131234c2c519b613e55902d9a Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 8 Apr 2021 16:06:00 +0100 Subject: [PATCH 0055/3032] Added automatic CSV export when bulk deleting members refs https://github.com/TryGhost/Team/issues/585 - updated bulk destroy task to first use the current query params to fetch from the appropriate CSV export endpoint and trigger a download - fetches via JS and triggers download from a blob URL link instead of an iframe so that we can be sure the download is successful before we hit the bulk delete endpoint - works differently to user deletion download because the server is not generating an export file and saving it meaning the client has to be sure we don't delete data before it's exported - updated copy in the confirmation modal to reflect the download behaviour --- app/components/modal-delete-members.hbs | 5 +++- app/controllers/members.js | 35 +++++++++++++++++++++++-- mirage/config/members.js | 8 ++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/app/components/modal-delete-members.hbs b/app/components/modal-delete-members.hbs index 1a772107e0..2020af0220 100644 --- a/app/components/modal-delete-members.hbs +++ b/app/components/modal-delete-members.hbs @@ -10,6 +10,9 @@ {{gh-pluralize this.model.memberCount "member"}}. This is permanent! All Ghost data will be deleted, this will have no effect on subscriptions in Stripe.

    +

    + A backup of your selection will be automatically downloaded to your device before deletion. +

    {{else}}
    @@ -52,7 +55,7 @@ res.blob()) + .then((blob) => { + const blobUrl = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = blobUrl; + a.download = `members.${moment().format('YYYY-MM-DD')}.csv`; + document.body.appendChild(a); + if (!this.isTesting) { + a.click(); + } + a.remove(); + URL.revokeObjectURL(blobUrl); + }); + + // backup downloaded, continue with deletion + + const deleteUrl = `${this.ghostPaths.url.api('members')}?${query}`; // response contains details of which members failed to be deleted - let response = yield this.ajax.del(url); + const response = yield this.ajax.del(deleteUrl); // reset and reload this.store.unloadAll('member'); diff --git a/mirage/config/members.js b/mirage/config/members.js index 8fdf0c5544..abbdb10055 100644 --- a/mirage/config/members.js +++ b/mirage/config/members.js @@ -146,5 +146,13 @@ export default function mockMembers(server) { server.del('/members/:id/'); + server.get('/members/upload/', function () { + return new Response(200, { + 'Content-Disposition': 'attachment', + filename: `members.${moment().format('YYYY-MM-DD')}.csv`, + 'Content-Type': 'text/csv' + }, ''); + }); + mockMembersStats(server); } From 87dfa85477401e8148d4cc6978fb0ae2748d3249 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 8 Apr 2021 17:19:50 +0200 Subject: [PATCH 0056/3032] Updated product detail page mockup - updated layout for static product detail page --- app/styles/layouts/products.css | 73 ++++++++++++++++++-- app/templates/settings.hbs | 4 +- app/templates/settings/product.hbs | 104 +++++++++++++++++++++++------ 3 files changed, 152 insertions(+), 29 deletions(-) diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index e4c56b95ff..f2b00eded9 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -1,4 +1,11 @@ /* Product list */ +.gh-product-list .gh-list-row.header .gh-list-header { + margin: 0; + padding: 0; + height: 0; + line-height: 0; +} + .gh-product-list-chevron { padding-right: 0; } @@ -24,7 +31,6 @@ .gh-product-details-form { display: flex; - flex-grow: 1; align-items: flex-start; padding-top: 20px !important; } @@ -65,10 +71,22 @@ .gh-product-stat-container { display: flex; flex-direction: column; - flex-grow: 1; - border: 1px solid var(--whitegrey); - padding: 24px; - border-radius: 3px; +} + +.gh-product-stat-details .data { + white-space: nowrap; + font-size: 3.1rem; + line-height: 1em; + font-weight: 700; + letter-spacing: 0; + margin: 0 0 2px; + padding: 0; +} + +.gh-product-stat-details .info { + color: var(--midgrey); + margin: 0 0 10px; + padding: 0; } .gh-product-chart { @@ -79,5 +97,48 @@ display: flex; align-items: center; justify-content: center; - margin: 12px 0; + margin: 0 0 12px; +} + +/* Price list */ +.gh-price-list { + margin-bottom: 24px; +} + +.gh-price-list a span { + color: var(--midgrey); + font-size: 1.3rem; +} + +.gh-price-list-actionlist { + display: flex; + align-items: center; + justify-content: flex-end; + width: 100%; + opacity: 0; +} + +.gh-price-list .gh-list-row:hover .gh-price-list-actionlist { + opacity: 1; +} + +.gh-price-list-actionlist a, +.gh-price-list-actionlist button { + line-height: 0; +} + +.gh-price-list-title, +.gh-price-list-price { + width: 35%; +} + +.product-actions-menu { + top: calc(100% + 6px); + right: 10px; + left: auto; +} + +.product-actions-menu.fade-out { + animation-duration: 0.01s; + pointer-events: none; } \ No newline at end of file diff --git a/app/templates/settings.hbs b/app/templates/settings.hbs index 86aeb1df1b..77851cf6ea 100644 --- a/app/templates/settings.hbs +++ b/app/templates/settings.hbs @@ -65,14 +65,14 @@ {{#if this.session.user.isOwner}} - {{svg-jar "email-stroke"}} + {{svg-jar "email-stroke"}}

    Email newsletter

    Customise emails and set email addresses

    - {{svg-jar "piggy-bank"}} + {{svg-jar "piggy-bank"}}

    Payments

    Connect to Stripe and set up prices

    diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index 194c0e61eb..24750babd8 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -8,6 +8,22 @@ Product name
    + + + + {{svg-jar "settings"}} + + + + +
  • + +
  • +
    +
    +
    +

    Product details

    - +
    Icon
    @@ -42,12 +59,12 @@
    +

    Members

    -

    Members

    CHART
    - 330 - members have access to this product +

    330

    +

    members have access to this product

    See members →
    @@ -59,58 +76,103 @@
    1. -
      Prices
      -
      +
      Prices(3)
      +
      Price
      +
      Subscriptions
      +
    2. - +

      Monthly

      - $5 USD / month • Full access + Full access

      - -
      - + + $5 USD / month + + + + 91 + + + +
      + + {{svg-jar "pen" class="w6 h6 fill-midgrey pa1 mr1"}} + +
    3. - +

      Yearly

      - $50 USD / month • 37% discount + 37% discount

      - -
      - + + $50 USD / year + + + + 76 + + + +
      + + {{svg-jar "pen" class="w6 h6 fill-midgrey pa1 mr1"}} + +
    4. - +

      Complimentary

      - $0 USD / year • Free of charge subscription + Free of charge subscription

      - -
      - + + $0 USD + + + + 18 + + + +
      + + {{svg-jar "pen" class="w6 h6 fill-midgrey pa1 mr1"}} + +
    + + + New price +
    From 7382c8317d5035f141051636743f96a4a8f93f39 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 8 Apr 2021 17:25:32 +0200 Subject: [PATCH 0057/3032] Updated settings icon colors --- app/styles/layouts/settings.css | 8 ++++---- app/templates/settings.hbs | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 6f8389cefd..7d3cb30325 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -76,19 +76,19 @@ color: #fff; } -.gh-settings-main-grid .gh-setting-group span.color-1 { +.gh-settings-main-grid .gh-setting-group span.yellow { background: var(--yellow); } -.gh-settings-main-grid .gh-setting-group span.color-2 { +.gh-settings-main-grid .gh-setting-group span.green { background: var(--green); } -.gh-settings-main-grid .gh-setting-group span.color-3 { +.gh-settings-main-grid .gh-setting-group span.blue { background: var(--blue); } -.gh-settings-main-grid .gh-setting-group span.color-4 { +.gh-settings-main-grid .gh-setting-group span.pink { background: var(--pink); } diff --git a/app/templates/settings.hbs b/app/templates/settings.hbs index 77851cf6ea..1d255dcdbd 100644 --- a/app/templates/settings.hbs +++ b/app/templates/settings.hbs @@ -9,28 +9,28 @@
    Website
    - {{svg-jar "settings"}} + {{svg-jar "settings"}}

    General

    Basic publication details and site metadata

    - {{svg-jar "view-site"}} + {{svg-jar "view-site"}}

    Theme

    Install and update themes

    - {{svg-jar "compass-2"}} + {{svg-jar "compass-2"}}

    Navigation

    Set up primary and secondary menus

    @@ -42,14 +42,14 @@
    {{#if (enable-developer-experiments)}} - {{svg-jar "eye"}} + {{svg-jar "eye"}}

    Access

    Configure members usage and default access levels

    - {{svg-jar "module"}} + {{svg-jar "module"}}

    Products

    Set up subscription products and prices

    @@ -57,7 +57,7 @@ {{/if}} {{#if this.session.user.isOwner}} - {{svg-jar "email-stroke"}} + {{svg-jar "email-stroke"}}

    Email newsletter

    Customise emails and set email addresses

    - {{svg-jar "piggy-bank"}} + {{svg-jar "piggy-bank"}}

    Payments

    Connect to Stripe and set up prices

    @@ -84,14 +84,14 @@
    Advanced
    - {{svg-jar "brackets"}} + {{svg-jar "brackets"}}

    Code injection

    Add code to your publication

    - {{svg-jar "labs"}} + {{svg-jar "labs"}}

    Labs

    Testing ground for new features

    From 3a111bbc81c4a424b002b0ec00f473c4451097f0 Mon Sep 17 00:00:00 2001 From: Thibaut Patel Date: Thu, 8 Apr 2021 19:32:46 +0200 Subject: [PATCH 0058/3032] Fix UploadThemeController to support disable:true customThemes flag no issue --- app/controllers/settings/theme/uploadtheme.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings/theme/uploadtheme.js b/app/controllers/settings/theme/uploadtheme.js index 478cfc399a..80385f8861 100644 --- a/app/controllers/settings/theme/uploadtheme.js +++ b/app/controllers/settings/theme/uploadtheme.js @@ -5,6 +5,6 @@ export default class UploadThemeController extends Controller { @service config; get isAllowed() { - return !this.config.get('hostSettings')?.limits?.customThemes; + return (!this.config.get('hostSettings')?.limits?.customThemes) || this.config.get('hostSettings').limits.customThemes.disabled; } } From 2c3f0e2ecef1269a80abb569cec2f3ad2617585e Mon Sep 17 00:00:00 2001 From: Thibaut Patel Date: Thu, 8 Apr 2021 20:23:21 +0200 Subject: [PATCH 0059/3032] Fix customThemes flag commit https://github.com/TryGhost/Admin/commit/3a111bbc81c4a424b002b0ec00f473c4451097f0 - disabled = true means that the feature is disabled --- app/controllers/settings/theme/uploadtheme.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings/theme/uploadtheme.js b/app/controllers/settings/theme/uploadtheme.js index 80385f8861..abbc395017 100644 --- a/app/controllers/settings/theme/uploadtheme.js +++ b/app/controllers/settings/theme/uploadtheme.js @@ -5,6 +5,6 @@ export default class UploadThemeController extends Controller { @service config; get isAllowed() { - return (!this.config.get('hostSettings')?.limits?.customThemes) || this.config.get('hostSettings').limits.customThemes.disabled; + return (!this.config.get('hostSettings')?.limits?.customThemes) || !this.config.get('hostSettings').limits.customThemes.disabled; } } From e8310f5acff169e0b60de6e9f58ab3288c7e1300 Mon Sep 17 00:00:00 2001 From: Thibaut Patel Date: Fri, 9 Apr 2021 11:16:37 +0200 Subject: [PATCH 0060/3032] Fix the limit service when querying an empty config commit https://github.com/TryGhost/Admin/commit/f552d096f5576d55aafe877979e41c30e67300a8 --- app/controllers/settings/theme/uploadtheme.js | 4 +- app/services/limit.js | 38 ++++++++++--------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/app/controllers/settings/theme/uploadtheme.js b/app/controllers/settings/theme/uploadtheme.js index abbc395017..3e8889fd55 100644 --- a/app/controllers/settings/theme/uploadtheme.js +++ b/app/controllers/settings/theme/uploadtheme.js @@ -2,9 +2,9 @@ import Controller from '@ember/controller'; import {inject as service} from '@ember/service'; export default class UploadThemeController extends Controller { - @service config; + @service limit; get isAllowed() { - return (!this.config.get('hostSettings')?.limits?.customThemes) || !this.config.get('hostSettings').limits.customThemes.disabled; + return !this.limit.limiter.isLimited('customThemes'); } } diff --git a/app/services/limit.js b/app/services/limit.js index 46a9be9ed8..c6f3cf139b 100644 --- a/app/services/limit.js +++ b/app/services/limit.js @@ -33,28 +33,30 @@ export default class LimitsService extends Service { let limits = this.config.get('hostSettings.limits'); - if (limits && !this.limiter) { - this.limiter = new LimitService(); + this.limiter = new LimitService(); - let helpLink; + if (!limits) { + return; + } - if (this.config.get('hostSettings.billing.enabled') - && this.config.get('hostSettings.billing.enabled') === true - && this.config.get('hostSettings.billing.url')) { - helpLink = this.config.get('hostSettings.billing.url'); - } else { - helpLink = 'https://ghost.org/help/'; - } + let helpLink; - return this.limiter.loadLimits({ - limits: this.decorateWithCountQueries(limits), - helpLink, - errors: { - HostLimitError, - IncorrectUsageError - } - }); + if (this.config.get('hostSettings.billing.enabled') + && this.config.get('hostSettings.billing.enabled') === true + && this.config.get('hostSettings.billing.url')) { + helpLink = this.config.get('hostSettings.billing.url'); + } else { + helpLink = 'https://ghost.org/help/'; } + + return this.limiter.loadLimits({ + limits: this.decorateWithCountQueries(limits), + helpLink, + errors: { + HostLimitError, + IncorrectUsageError + } + }); } decorateWithCountQueries(limits) { From d7c0b86fb6cf55c1005c30c9944195a814a2ac1c Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 9 Apr 2021 13:00:41 +0200 Subject: [PATCH 0061/3032] Added mock product price modal no refs. - added static price modal to product detail page --- .../gh-products-price-billingperiod.hbs | 9 ++ .../gh-products-price-billingperiod.js | 20 ++++ app/components/modal-product-price.hbs | 106 ++++++++++++++++++ app/components/modal-product-price.js | 3 + app/controllers/settings/product.js | 6 + app/router.js | 1 - app/styles/components/modals.css | 24 ++++ app/styles/layouts/products.css | 11 ++ app/templates/settings/product.hbs | 12 +- 9 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 app/components/gh-products-price-billingperiod.hbs create mode 100644 app/components/gh-products-price-billingperiod.js create mode 100644 app/components/modal-product-price.hbs create mode 100644 app/components/modal-product-price.js diff --git a/app/components/gh-products-price-billingperiod.hbs b/app/components/gh-products-price-billingperiod.hbs new file mode 100644 index 0000000000..0b2ded9911 --- /dev/null +++ b/app/components/gh-products-price-billingperiod.hbs @@ -0,0 +1,9 @@ + + + {{svg-jar "arrow-down-small"}} + \ No newline at end of file diff --git a/app/components/gh-products-price-billingperiod.js b/app/components/gh-products-price-billingperiod.js new file mode 100644 index 0000000000..c5a340b3d8 --- /dev/null +++ b/app/components/gh-products-price-billingperiod.js @@ -0,0 +1,20 @@ +import Component from '@ember/component'; + +const PERIODS = [ + {label: 'Daily', period: 'daily'}, + {label: 'Weekly', period: 'members'}, + {label: 'Monthly', period: 'monthly'}, + {label: 'Every 3 months', period: '3-months'}, + {label: 'Every 6 months', period: '6-months'}, + {label: 'Yearly', period: 'yearly'}, + {label: 'Custom', period: 'custom'}, + {label: 'One time', period: 'one-time'}, + {label: 'Unbilled', period: 'unbilled'} +]; + +export default Component.extend({ + init() { + this._super(...arguments); + this.availablePeriods = PERIODS; + } +}); \ No newline at end of file diff --git a/app/components/modal-product-price.hbs b/app/components/modal-product-price.hbs new file mode 100644 index 0000000000..a724deec17 --- /dev/null +++ b/app/components/modal-product-price.hbs @@ -0,0 +1,106 @@ + + + +
    + +
    + + \ No newline at end of file diff --git a/app/components/modal-product-price.js b/app/components/modal-product-price.js new file mode 100644 index 0000000000..effbd5c97a --- /dev/null +++ b/app/components/modal-product-price.js @@ -0,0 +1,3 @@ +import ModalComponent from 'ghost-admin/components/modal-base'; + +export default ModalComponent.extend({}); \ No newline at end of file diff --git a/app/controllers/settings/product.js b/app/controllers/settings/product.js index 3a80a394dd..9c1e1d2d6d 100644 --- a/app/controllers/settings/product.js +++ b/app/controllers/settings/product.js @@ -8,6 +8,7 @@ export default class ProductController extends Controller { @service settings; @tracked showLeaveSettingsModal = false; + @tracked showPriceModal = false; leaveRoute(transition) { if (this.settings.get('hasDirtyAttributes')) { @@ -30,6 +31,11 @@ export default class ProductController extends Controller { this.leaveSettingsTransition = null; } + @action + closePriceModal() { + this.showPriceModal = false; + } + @task({drop: true}) *saveTask() { return yield this.settings.save(); diff --git a/app/router.js b/app/router.js index 677e8b7f27..3530288d3b 100644 --- a/app/router.js +++ b/app/router.js @@ -55,7 +55,6 @@ Router.map(function () { this.route('settings.products', {path: '/settings/products'}); this.route('settings.product', {path: '/settings/product'}); - this.route('settings.price', {path: '/settings/price'}); this.route('settings.theme', {path: '/settings/theme'}, function () { this.route('uploadtheme'); diff --git a/app/styles/components/modals.css b/app/styles/components/modals.css index 76d16a353c..58edd153aa 100644 --- a/app/styles/components/modals.css +++ b/app/styles/components/modals.css @@ -74,6 +74,30 @@ margin: 6vw 0; } +.fullscreen-modal-body-scrolling .modal-body { + max-height: calc(100vh - 12vw - 12vmin - 24px - 34px - 64px); /* top and bottom margins + extra padding at the bottom + modal header & footer */ + overflow-y: scroll; + margin: 0 -32px; + padding: 0 32px; +} + +.fullscreen-modal-body-scrolling .modal-footer { + position: relative; + margin: 20px -32px 0; + padding: 0 32px; +} + +.fullscreen-modal-body-scrolling .modal-footer:before { + position: absolute; + content: ""; + top: -20px; + left: -32px; + right: -32px; + height: 6px; + background: hsla(0,0%,100%,0); + box-shadow: 0 -0.3px 1px rgb(0 0 0 / 3%), 0 -4px 7px rgb(0 0 0 / 6%); +} + /* The modal /* ---------------------------------------------------------- */ diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index f2b00eded9..1e89e8310e 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -141,4 +141,15 @@ .product-actions-menu.fade-out { animation-duration: 0.01s; pointer-events: none; +} + +/* Price details */ +.gh-product-priceform-block { + margin-bottom: 32px; +} + +.gh-product-priceform-period { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 20px; } \ No newline at end of file diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index 24750babd8..633d1620fe 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -169,13 +169,19 @@ - - + +
    + {{#if this.showPriceModal}} + + {{/if}} + {{#if this.showLeaveSettingsModal}} Date: Sat, 10 Apr 2021 08:16:16 +0100 Subject: [PATCH 0062/3032] Extracted role selector to `` component refs https://github.com/TryGhost/Team/issues/572 - preparation for re-using the new role selector in a model when changing an existing user's role --- app/components/gh-role-selection.hbs | 154 +++++++++++++++++++++++ app/components/gh-role-selection.js | 54 ++++++++ app/components/modal-invite-new-user.hbs | 154 +---------------------- app/components/modal-invite-new-user.js | 42 +------ 4 files changed, 213 insertions(+), 191 deletions(-) create mode 100644 app/components/gh-role-selection.hbs create mode 100644 app/components/gh-role-selection.js diff --git a/app/components/gh-role-selection.hbs b/app/components/gh-role-selection.hbs new file mode 100644 index 0000000000..f520c79999 --- /dev/null +++ b/app/components/gh-role-selection.hbs @@ -0,0 +1,154 @@ +
    + {{#if this.fetchRolesTask.isRunning}} + + {{else}} +
    +
    +
    +
    Contributor
    +
    Can create and edit their own posts, but cannot publish. An Editor needs to approve and publish for them.
    +
    +
    + {{!-- Inner container collapses height to the SVG so popover can align correctly --}} +
    + {{svg-jar "info"}} + + + + + + + + + + + + +
    SettingsView and edit own profile
    PostsCreate and edit own draft posts
    +
    +
    +
    +
    + +
    +
    +
    +
    Author
    +
    A trusted user who can create, edit and publish their own posts, but can’t modify others.
    +
    +
    + {{!-- Inner container collapses height to the SVG so popover can align correctly --}} +
    + {{svg-jar "info"}} + + + + + + + + + + + + + + + + + + + + +
    SettingsView and edit own profile
    UsersBrowse users
    PostsView, edit and publish own posts, generate slugs
    TagsAdd tags
    +
    +
    +
    +
    + +
    +
    +
    +
    Editor
    +
    Can invite and manage other Authors and Contributors, as well as edit and publish any posts on the site.
    +
    +
    + {{!-- Inner container collapses height to the SVG so popover can align correctly --}} +
    + {{svg-jar "info"}} + + + + + + + + + + + + + + + + + + + + +
    SettingsView and edit own profile
    UsersBrowse users, manage authors and contributors (invite, revoke, delete)
    PostsCreate, publish, edit and delete all posts, generate slugs
    TagsEdit, add and delete tags
    +
    +
    +
    +
    + +
    +
    +
    +
    Administrator
    +
    Trusted staff user who should be able to manage all content and users, as well as site settings and options.
    +
    +
    + {{!-- Inner container collapses height to the SVG so popover can align correctly --}} +
    + {{svg-jar "info"}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SettingsAccess all except Stripe settings
    UsersManage all users (invite, revoke, delete)
    PostsCreate, publish, edit and delete all posts, generate slugs
    TagsEdit, add and delete tags
    DatabaseImport, export and delete all content
    EmailSend newsletters and test emails
    +
    +
    +
    +
    + + + + {{/if}} +
    \ No newline at end of file diff --git a/app/components/gh-role-selection.js b/app/components/gh-role-selection.js new file mode 100644 index 0000000000..1a215d5078 --- /dev/null +++ b/app/components/gh-role-selection.js @@ -0,0 +1,54 @@ +import Component from '@glimmer/component'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; + +const DEFAULT_ROLE_NAME = 'Contributor'; + +export default class GhRoleSelectionComponent extends Component { + @service limit; + @service notifications; + @service store; + + @tracked roles = []; + @tracked limitErrorMessage = null; + + @action + async setRole(roleName) { + const role = this.roles.findBy('name', roleName); + this.args.setRole(role); + return this.validateRole(); + } + + @task + *fetchRolesTask() { + const roles = yield this.store.query('role', {permissions: 'assign'}); + const defaultRole = roles.findBy('name', DEFAULT_ROLE_NAME); + + this.roles = roles; + + if (!this.args.role && defaultRole) { + this.args.setRole(defaultRole); + } + } + + async validateRole(role) { + if (role.name !== 'Contributor' + && this.limit.limiter && this.limit.limiter.isLimited('staff')) { + try { + await this.limit.limiter.errorIfWouldGoOverLimit('staff'); + + this.limitErrorMessage = null; + } catch (error) { + if (error.errorType === 'HostLimitError') { + this.limitErrorMessage = error.message; + } else { + this.notifications.showAPIError(error, {key: 'staff.limit'}); + } + } + } else { + this.limitErrorMessage = null; + } + } +} diff --git a/app/components/modal-invite-new-user.hbs b/app/components/modal-invite-new-user.hbs index 7dba0ad557..6326bc16b7 100644 --- a/app/components/modal-invite-new-user.hbs +++ b/app/components/modal-invite-new-user.hbs @@ -30,156 +30,10 @@ -
    -
    -
    -
    -
    Contributor
    -
    Can create and edit their own posts, but cannot publish. An Editor needs to approve and publish for them.
    -
    -
    - {{!-- Inner container collapses height to the SVG so popover can align correctly --}} -
    - {{svg-jar "info"}} - - - - - - - - - - - - -
    SettingsView and edit own profile
    PostsCreate and edit own draft posts
    -
    -
    -
    -
    - -
    -
    -
    -
    Author
    -
    A trusted user who can create, edit and publish their own posts, but can’t modify others.
    -
    -
    - {{!-- Inner container collapses height to the SVG so popover can align correctly --}} -
    - {{svg-jar "info"}} - - - - - - - - - - - - - - - - - - - - -
    SettingsView and edit own profile
    UsersBrowse users
    PostsView, edit and publish own posts, generate slugs
    TagsAdd tags
    -
    -
    -
    -
    - -
    -
    -
    -
    Editor
    -
    Can invite and manage other Authors and Contributors, as well as edit and publish any posts on the site.
    -
    -
    - {{!-- Inner container collapses height to the SVG so popover can align correctly --}} -
    - {{svg-jar "info"}} - - - - - - - - - - - - - - - - - - - - -
    SettingsView and edit own profile
    UsersBrowse users, manage authors and contributors (invite, revoke, delete)
    PostsCreate, publish, edit and delete all posts, generate slugs
    TagsEdit, add and delete tags
    -
    -
    -
    -
    - -
    -
    -
    -
    Administrator
    -
    Trusted staff user who should be able to manage all content and users, as well as site settings and options.
    -
    -
    - {{!-- Inner container collapses height to the SVG so popover can align correctly --}} -
    - {{svg-jar "info"}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    SettingsAccess all except Stripe settings
    UsersManage all users (invite, revoke, delete)
    PostsCreate, publish, edit and delete all posts, generate slugs
    TagsEdit, add and delete tags
    DatabaseImport, export and delete all content
    EmailSend newsletters and test emails
    -
    -
    -
    -
    - - - -
    +
    diff --git a/app/components/modal-invite-new-user.js b/app/components/modal-invite-new-user.js index a2b177877d..fbb070bfae 100644 --- a/app/components/modal-invite-new-user.js +++ b/app/components/modal-invite-new-user.js @@ -17,17 +17,9 @@ export default ModalComponent.extend(ValidationEngine, { classNames: 'modal-content invite-new-user', role: null, - roles: null, - - limitErrorMessage: null, validationType: 'inviteUser', - didInsertElement() { - this._super(...arguments); - this.fetchRoles.perform(); - }, - willDestroyElement() { this._super(...arguments); // TODO: this should not be needed, ValidationEngine acts as a @@ -42,32 +34,11 @@ export default ModalComponent.extend(ValidationEngine, { } }, - setRole: action(function (roleName) { - const role = this.roles.findBy('name', roleName); + setRole: action(function (role) { this.set('role', role); this.errors.remove('role'); - this.validateRole(); }), - async validateRole() { - if (this.get('role.name') !== 'Contributor' - && this.limit.limiter && this.limit.limiter.isLimited('staff')) { - try { - await this.limit.limiter.errorIfWouldGoOverLimit('staff'); - - this.set('limitErrorMessage', null); - } catch (error) { - if (error.errorType === 'HostLimitError') { - this.set('limitErrorMessage', error.message); - } else { - this.notifications.showAPIError(error, {key: 'staff.limit'}); - } - } - } else { - this.set('limitErrorMessage', null); - } - }, - validate() { let email = this.email; @@ -103,17 +74,6 @@ export default ModalComponent.extend(ValidationEngine, { })); }, - fetchRoles: task(function * () { - let roles = yield this.store.query('role', {permissions: 'assign'}); - let defaultRole = roles.findBy('name', 'Contributor'); - - this.set('roles', roles); - - if (!this.role) { - this.set('role', defaultRole); - } - }), - sendInvitation: task(function* () { let email = this.email; let role = this.role; From 7239a2b7bb649dd5900fbee958a3c5727fdff894 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Sat, 10 Apr 2021 08:40:16 +0100 Subject: [PATCH 0063/3032] Update dependency ember-one-way-select to 4.0.1 --- package.json | 2 +- yarn.lock | 20 ++++++-------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index a20f8980ca..48a3530970 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "ember-mocha": "0.16.2", "ember-modifier": "2.1.1", "ember-moment": "8.0.1", - "ember-one-way-select": "4.0.0", + "ember-one-way-select": "4.0.1", "ember-power-calendar-moment": "0.1.7", "ember-power-datepicker": "0.8.1", "ember-power-select": "4.1.0", diff --git a/yarn.lock b/yarn.lock index ac88b0a5a3..743a0f0953 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6656,13 +6656,6 @@ ember-infinity@2.1.2: dependencies: ember-cli-babel "^6.6.0" -ember-invoke-action@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ember-invoke-action/-/ember-invoke-action-1.5.1.tgz#b6cad51ee729fc227cdbdba83b2b5486f0fa5834" - integrity sha512-co6Yg9r5qtK4LvZTZHk+u02YLPbnM2c5ZkXvundxEj3V7qdZg7RULfjU09LmohD+rxW5ADZlwgBi/32XIEWTlw== - dependencies: - ember-cli-babel "^6.6.0" - ember-keyboard@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-6.0.2.tgz#efe260be34621a403a4d4688b038d65b371f6892" @@ -6774,14 +6767,13 @@ ember-moment@8.0.1: ember-getowner-polyfill "^2.2.0" ember-macro-helpers "^4.2.2" -ember-one-way-select@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ember-one-way-select/-/ember-one-way-select-4.0.0.tgz#4da2a8b8abb3360feaa69099ea31989ad3068e89" - integrity sha512-KmdSJqaTuKA+yn+qmlIVKJ+6qXpJeyOt8UBGRFjIdXoa7PPlYSiZ4eRe4uTcy3CUqXHDCPC+8/9AnZe061SBMw== +ember-one-way-select@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/ember-one-way-select/-/ember-one-way-select-4.0.1.tgz#f16c614b5b23fa4677686ed762a3839e5ee3adf2" + integrity sha512-B1Li794T1lmg7/d+PSQMnfPTCnDA+FBYD+UOpdIZ9oqMrX0NtQLeERzNVqOR7MbsDAvMkvQFV3YSIVQOuKJjhg== dependencies: - ember-cli-babel "^6.6.0" - ember-cli-htmlbars "^2.0.1" - ember-invoke-action "^1.5.0" + ember-cli-babel "^7.22.1" + ember-cli-htmlbars "^5.3.1" ember-power-calendar-moment@0.1.7: version "0.1.7" From 4e148a57fd2eab120704b297974f6b7658f94bc7 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Sat, 10 Apr 2021 08:54:08 +0100 Subject: [PATCH 0064/3032] Attempted to fix renovate config refs https://github.com/TryGhost/Admin/pull/1830 - Renovate hasn't tried to update any packages since January when the postcss dependencies were pinned and Renovate config updated to try and disable css related package updates - it's possible the `enabled: false` was affecting everything because the wrong extends was used in the package rule. Swapped from `groupCSS` to `pkgCSS` to better match the intention of disabling specific packages --- renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 61d1b25ee5..27f8261a46 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,7 @@ { "extends": [ "@tryghost:quietJS", + "@tryghost:groupCSS", "@tryghost:disableTryGhostAutomerge" ], "ignoreDeps": [ @@ -24,7 +25,7 @@ "packageNames": ["ember-mocha", "ember-exam", "testem"] }, { - "extends": "@tryghost:groupCSS", + "extends": "@tryghost:pkgCSS", "enabled": false } ] From 2a74c8703f10f7b36370ec95484011a41eca7a2a Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Sat, 10 Apr 2021 09:02:10 +0100 Subject: [PATCH 0065/3032] Fixed renovate config refs https://github.com/TryGhost/Admin/commit/4e148a57fd2eab120704b297974f6b7658f94bc7 refs https://github.com/TryGhost/Admin/pull/1830 - using `renovate-config-validator` it appears Renovate doesn't support extends within packageRules or at least requires direct selectors rather than extended selectors - copied package rules from `@tryghost:pkgCSS` across rather than using `extends` --- renovate.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 27f8261a46..4c5f4d1797 100644 --- a/renovate.json +++ b/renovate.json @@ -25,7 +25,15 @@ "packageNames": ["ember-mocha", "ember-exam", "testem"] }, { - "extends": "@tryghost:pkgCSS", + "groupName": "disable css", + "packagePatterns": [ + "^postcss", + "^css" + ], + "packageNames": [ + "autoprefixer", + "ember-cli-postcss" + ], "enabled": false } ] From 68c513ec34d0dac5b14d1bd5b8e810ca52a0a4dc Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 12 Apr 2021 00:51:22 +0000 Subject: [PATCH 0066/3032] Update Test & linting packages --- package.json | 6 ++-- yarn.lock | 86 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 55 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 48a3530970..74ec2f5342 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "broccoli-funnel": "3.0.3", "broccoli-merge-trees": "4.2.0", "broccoli-terser-sourcemap": "4.1.0", - "chai": "4.2.0", - "chai-dom": "1.8.2", + "chai": "4.3.4", + "chai-dom": "1.9.0", "codemirror": "5.48.2", "csscomb": "4.3.0", "cssnano": "4.1.10", @@ -106,7 +106,7 @@ "ember-truth-helpers": "3.0.0", "ember-useragent": "0.10.0", "emberx-file-input": "1.2.1", - "eslint": "7.18.0", + "eslint": "7.24.0", "eslint-plugin-ghost": "2.0.0", "faker": "5.1.0", "fs-extra": "9.0.1", diff --git a/yarn.lock b/yarn.lock index 743a0f0953..b1743bd013 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": +"@babel/code-frame@7.12.11", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== @@ -1520,10 +1520,10 @@ resolve "^1.8.1" semver "^7.3.2" -"@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== +"@eslint/eslintrc@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" + integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -1532,7 +1532,6 @@ ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.20" minimatch "^3.0.4" strip-json-comments "^3.1.1" @@ -4437,26 +4436,26 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chai-dom@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/chai-dom/-/chai-dom-1.8.2.tgz#e06353baeafa8fddaaabda96a67f859c111a3c7c" - integrity sha512-kk2SnCuJliouO5M58OjA7M8VXN338WAxHOm+LbpjeL09pJgRpXugSC5aj8uwFm/6Lmpcdtq7hf+DldTdBm5/Sw== +chai-dom@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/chai-dom/-/chai-dom-1.9.0.tgz#40c1b957b60c677b0d06ca320ee8f1e276d9ea04" + integrity sha512-UXSbhcGVBWv/5qVqbJY/giTDRyo3wKapUsWluEuVvxcJLFXkyf8l4D2PTd6trzrmca6WWnGdpaFkYdl1P0WjtA== chai-jquery@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/chai-jquery/-/chai-jquery-2.1.0.tgz#ce40fb5d853e7886688787f16d14cd9595388563" integrity sha512-DiKSXcmInlt4d+WC5PkisDL5MsgJPd1lCSfZ3NgeSZJ34CJntEIpPOCdpalH2IhOWHeLpESJaiuHFxX1dpZ6bw== -chai@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== +chai@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" deep-eql "^3.0.1" get-func-name "^2.0.0" - pathval "^1.1.0" + pathval "^1.1.1" type-detect "^4.0.5" chalk@^1.0.0, chalk@^1.1.3: @@ -7322,13 +7321,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.18.0: - version "7.18.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.18.0.tgz#7fdcd2f3715a41fe6295a16234bd69aed2c75e67" - integrity sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ== +eslint@7.24.0: + version "7.24.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a" + integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.3.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -7339,12 +7338,12 @@ eslint@7.18.0: eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" - esquery "^1.2.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^6.0.0" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" - globals "^12.1.0" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -7352,7 +7351,7 @@ eslint@7.18.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.20" + lodash "^4.17.21" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -7492,13 +7491,20 @@ esprima@~3.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= -esquery@^1.0.1, esquery@^1.2.0: +esquery@^1.0.1: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: estraverse "^5.1.0" +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -7874,10 +7880,10 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-entry-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" - integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" @@ -8498,6 +8504,13 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globals@^13.6.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== + dependencies: + type-fest "^0.20.2" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -11598,10 +11611,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.3: version "3.1.1" @@ -14035,6 +14048,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" From 510807fb66cd24f4a65fc022d73a38fb9fea91cb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:35:24 +0100 Subject: [PATCH 0067/3032] Pin dependency ember-keyboard to 6.0.2 (#1885) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 74ec2f5342..90da314d1c 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "ember-fetch": "8.0.4", "ember-in-viewport": "3.8.1", "ember-infinity": "2.1.2", - "ember-keyboard": "^6.0.2", + "ember-keyboard": "6.0.2", "ember-load": "0.0.17", "ember-load-initializers": "2.1.2", "ember-mocha": "0.16.2", diff --git a/yarn.lock b/yarn.lock index b1743bd013..549a3ff537 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6655,7 +6655,7 @@ ember-infinity@2.1.2: dependencies: ember-cli-babel "^6.6.0" -ember-keyboard@^6.0.2: +ember-keyboard@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-6.0.2.tgz#efe260be34621a403a4d4688b038d65b371f6892" integrity sha512-ZGAXYGfN4gxGFRcv3ix2X8HA8j/VluwhlENT9pfbFjAAGtvFz9wzNUJuaq3LS5Ksj+f2oXL5f++tSOrO7Ha1wA== From d19920ad998d6bfa175868a2ed7b06932f5b7e89 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:35:36 +0100 Subject: [PATCH 0068/3032] Update dependency @glimmer/component to v1.0.4 (#1886) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 90da314d1c..bd63a486a5 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@ember/jquery": "1.1.0", "@ember/optional-features": "2.0.0", "@ember/render-modifiers": "1.0.2", - "@glimmer/component": "1.0.3", + "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "1.0.0", "@tryghost/helpers": "1.1.37", "@tryghost/kg-clean-basic-html": "1.0.11", diff --git a/yarn.lock b/yarn.lock index 549a3ff537..f4bcb782db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1535,7 +1535,27 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@glimmer/component@1.0.3", "@glimmer/component@^1.0.1", "@glimmer/component@^1.0.2": +"@glimmer/component@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@glimmer/component/-/component-1.0.4.tgz#1c85a5181615a6647f6acfaaed68e28ad7e9626e" + integrity sha512-sS4N8wtcKfYdUJ6O3m8nbTut6NjErdz94Ap8VB1ekcg4WSD+7sI7Nmv6kt2rdPoe363nUdjUbRBzHNWhLzraBw== + dependencies: + "@glimmer/di" "^0.1.9" + "@glimmer/env" "^0.1.7" + "@glimmer/util" "^0.44.0" + broccoli-file-creator "^2.1.1" + broccoli-merge-trees "^3.0.2" + ember-cli-babel "^7.7.3" + ember-cli-get-component-path-option "^1.0.0" + ember-cli-is-package-missing "^1.0.0" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "3.0.0" + ember-cli-version-checker "^3.1.3" + ember-compatibility-helpers "^1.1.2" + +"@glimmer/component@^1.0.1", "@glimmer/component@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/@glimmer/component/-/component-1.0.3.tgz#38c26fc4855fd7ad0e0816d18d80d32c578e5140" integrity sha512-GD3gcN+Pr2flmxkt2lm5K86jwX+KRD9QQpNH+wiEQGjBXOzd46+XD5npH1sRByqLYml9rW4klflcrEfNb7dnQw== From 11874f2c184974296af3eb9d81e952c198c33a52 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:35:54 +0100 Subject: [PATCH 0069/3032] Update dependency @tryghost/helpers to v1.1.41 (#1887) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index bd63a486a5..704fb5f0f9 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "1.0.0", - "@tryghost/helpers": "1.1.37", + "@tryghost/helpers": "1.1.41", "@tryghost/kg-clean-basic-html": "1.0.11", "@tryghost/kg-parser-plugins": "1.1.0", "@tryghost/limit-service": "0.4.0", diff --git a/yarn.lock b/yarn.lock index f4bcb782db..27afc450ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1760,10 +1760,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@tryghost/helpers@1.1.37": - version "1.1.37" - resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.37.tgz#116d3a971fbc889cc694882278c3248e03ec92bb" - integrity sha512-J1YOPlh09tRudPYmfeh0rBeQP1l646aBOWqwX+e9wELdu4Sxbw5ufH4UpkXu1sGWrxWTQfPjsrAK6EuKbOv4xA== +"@tryghost/helpers@1.1.41": + version "1.1.41" + resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.41.tgz#814a4969bca184826cba407fc3e6d651fef4473c" + integrity sha512-6JvLY38gE6y7kNQX+vlDJzfVHK0gGeODH6s07KZ7d/rpnPEuT3XeD2E2LLzhPC2XpLr6E4WH8oI6xQzCh9sqsw== dependencies: lodash-es "^4.17.11" From 30d698c632818bdb4dc3793628f643bc6c09114f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:36:13 +0100 Subject: [PATCH 0070/3032] Update dependency @tryghost/kg-parser-plugins to v1.1.6 (#1889) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 704fb5f0f9..5d287cb685 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@html-next/vertical-collection": "1.0.0", "@tryghost/helpers": "1.1.41", "@tryghost/kg-clean-basic-html": "1.0.11", - "@tryghost/kg-parser-plugins": "1.1.0", + "@tryghost/kg-parser-plugins": "1.1.6", "@tryghost/limit-service": "0.4.0", "@tryghost/members-csv": "0.4.2", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", diff --git a/yarn.lock b/yarn.lock index 27afc450ed..c6fc489718 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1767,17 +1767,22 @@ dependencies: lodash-es "^4.17.11" -"@tryghost/kg-clean-basic-html@1.0.11", "@tryghost/kg-clean-basic-html@^1.0.11": +"@tryghost/kg-clean-basic-html@1.0.11": version "1.0.11" resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.11.tgz#3dc7f5e0d425f2b141022d454ebde3d90bd5adc6" integrity sha512-dxc8eRzBzOjjuA15oWGOR+QGs3YWF9vA5ZyZUfDbv/EFg7m/6DJ2iz41hU5hOdH7W0pE06x61TlV+lETkoCqIA== -"@tryghost/kg-parser-plugins@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@tryghost/kg-parser-plugins/-/kg-parser-plugins-1.1.0.tgz#8900e99e64706d97d7523b5df8f696308f613785" - integrity sha512-nfL2Mi74PE3C1zX4fJvQeI9kTPXUvCCsf94Xw8K07uaeuv2awQc+E0LpwesttNYD0WGNpIlYS1nkCKsJp/c7jg== +"@tryghost/kg-clean-basic-html@^1.0.16": + version "1.0.16" + resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.16.tgz#223450ae1726a9bf91b1918281d3e6b89df434a6" + integrity sha512-4LJL1ue9BgmPPOO1/4xhp6E0ta2nE85V0vkxeNRxpun/zOC3EQP7hf2U6rYoZ6yz1fa+h7Yjvv9309q+zgzRCA== + +"@tryghost/kg-parser-plugins@1.1.6": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@tryghost/kg-parser-plugins/-/kg-parser-plugins-1.1.6.tgz#8c13acd65977e8e2c0c6a686a96ba32994e8faaf" + integrity sha512-IfwezZpqt96V1E/XujZnUTu/MQiUd0nBWELGmQJYChGAbbyi5B4Ef2qzaEXW3Ox+IBR6poOF63xFh+4sBWs1Aw== dependencies: - "@tryghost/kg-clean-basic-html" "^1.0.11" + "@tryghost/kg-clean-basic-html" "^1.0.16" "@tryghost/limit-service@0.4.0": version "0.4.0" From c79b19dd771c9c6566632d7a0e00c3f9e7e4372f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:36:30 +0100 Subject: [PATCH 0071/3032] Update dependency @tryghost/members-csv to v0.4.5 (#1891) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5d287cb685..13b7e120a4 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@tryghost/kg-clean-basic-html": "1.0.11", "@tryghost/kg-parser-plugins": "1.1.6", "@tryghost/limit-service": "0.4.0", - "@tryghost/members-csv": "0.4.2", + "@tryghost/members-csv": "0.4.5", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.16", "@tryghost/timezone-data": "0.2.35", diff --git a/yarn.lock b/yarn.lock index c6fc489718..613eb5948f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1791,10 +1791,10 @@ dependencies: lodash "^4.17.21" -"@tryghost/members-csv@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@tryghost/members-csv/-/members-csv-0.4.2.tgz#af6189ea30a18b7ebe1f67c442d459ea8ef7aff9" - integrity sha512-r7cuO1dBMeOycEr5331qYickaSHgut9IkzbPeVOwWK3Labt75se9i4/6us4KkmfwMQisR2mV3ZBVvz0ps5h76g== +"@tryghost/members-csv@0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@tryghost/members-csv/-/members-csv-0.4.5.tgz#a389221b64ddaebc1bc33ddaa92e40ca20018893" + integrity sha512-Q2FKbMphYYN3dIM8nGWGYrI6cyCqV2vpR6ECvZOq77ZW4jrZEIkftk2YfuoCufPfkWTjFc7Ct6dodDRGn2vcXg== dependencies: papaparse "5.3.0" From 62076da6a3e744eaf16497c04c7a4f5e7bdeade3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:36:47 +0100 Subject: [PATCH 0072/3032] Update dependency @tryghost/string to v0.1.17 (#1892) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 13b7e120a4..a2d113f889 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@tryghost/limit-service": "0.4.0", "@tryghost/members-csv": "0.4.5", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", - "@tryghost/string": "0.1.16", + "@tryghost/string": "0.1.17", "@tryghost/timezone-data": "0.2.35", "autoprefixer": "9.8.6", "babel-eslint": "10.1.0", diff --git a/yarn.lock b/yarn.lock index 613eb5948f..6f132d1f36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1806,10 +1806,10 @@ mobiledoc-dom-renderer "0.7.0" mobiledoc-text-renderer "0.4.0" -"@tryghost/string@0.1.16": - version "0.1.16" - resolved "https://registry.yarnpkg.com/@tryghost/string/-/string-0.1.16.tgz#815d8bbf62daffd6d4291145987f43f8ca98d5b2" - integrity sha512-+mRzCCp0LqTIugN6+NFrEfqlG05mMqyCzoLo1C/U4ApMX2HKvCo35A/mWY9vnA3eD99Ivo3Hsc3hfyTYQXOa6w== +"@tryghost/string@0.1.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@tryghost/string/-/string-0.1.17.tgz#deebdfcc0440e71ee8ff8101c9d30bd4a746a768" + integrity sha512-Z2BD7jOEG2ak28crhY6iaN/BqAi6ksNBUHzoknXmmoAN7UPGMuuMQ4PLu5kHUl6AGW/lIeBDoM0IfF4jkM6D0g== dependencies: unidecode "^0.1.8" From c05c0d83f0922f62ebc5ee075753d27d4aa26d73 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:37:28 +0100 Subject: [PATCH 0073/3032] Update dependency element-resize-detector to v1.2.2 (#1894) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a2d113f889..a16c224d10 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "codemirror": "5.48.2", "csscomb": "4.3.0", "cssnano": "4.1.10", - "element-resize-detector": "1.2.1", + "element-resize-detector": "1.2.2", "ember-ajax": "5.0.0", "ember-assign-helper": "0.3.0", "ember-auto-import": "1.10.1", diff --git a/yarn.lock b/yarn.lock index 6f132d1f36..c405c50a26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5730,10 +5730,10 @@ element-closest@^2.0.2: resolved "https://registry.yarnpkg.com/element-closest/-/element-closest-2.0.2.tgz#72a740a107453382e28df9ce5dbb5a8df0f966ec" integrity sha1-cqdAoQdFM4LijfnOXbtajfD5Zuw= -element-resize-detector@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.1.tgz#b0305194447a4863155e58f13323a0aef30851d1" - integrity sha512-BdFsPepnQr9fznNPF9nF4vQ457U/ZJXQDSNF1zBe7yaga8v9AdZf3/NElYxFdUh7SitSGt040QygiTo6dtatIw== +element-resize-detector@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.2.tgz#bf7c3ff915957e4e62e86241ed2f9c86b078892b" + integrity sha512-+LOXRkCJc4I5WhEJxIDjhmE3raF8jtOMBDqSCgZTMz2TX3oXAX5pE2+MDeopJlGdXzP7KzPbBJaUGfNaP9HG4A== dependencies: batch-processor "1.0.0" From f4cbfedda301d8b22308dfa7652a6f24eb44ea6e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:38:41 +0100 Subject: [PATCH 0074/3032] Update dependency ember-auto-import to v1.11.2 (#1895) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a16c224d10..77b7fe378c 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "element-resize-detector": "1.2.2", "ember-ajax": "5.0.0", "ember-assign-helper": "0.3.0", - "ember-auto-import": "1.10.1", + "ember-auto-import": "1.11.2", "ember-classic-decorator": "2.0.0", "ember-cli": "3.21.2", "ember-cli-app-version": "4.0.0", diff --git a/yarn.lock b/yarn.lock index c405c50a26..8401c4900b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5781,7 +5781,42 @@ ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: ember-cli-babel "^7.20.5" ember-cli-version-checker "^2.0.0" -ember-auto-import@1.10.1, ember-auto-import@^1.2.19, ember-auto-import@^1.5.2, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: +ember-auto-import@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.2.tgz#b6e9a0dddd88a10692830ffa4f5dfd8c137c8919" + integrity sha512-Sm0x9qgAQEx+XSYeh5zeKj89Uo0c7XzULZxuziFPxbhtKy/G4pywhBuQ7EgDznTj8IZVxOdfe4ufcUxnJtbSgg== + dependencies: + "@babel/core" "^7.1.6" + "@babel/preset-env" "^7.10.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" + "@embroider/core" "^0.33.0" + babel-core "^6.26.3" + babel-loader "^8.0.6" + babel-plugin-syntax-dynamic-import "^6.18.0" + babylon "^6.18.0" + broccoli-debug "^0.6.4" + broccoli-node-api "^1.7.0" + broccoli-plugin "^4.0.0" + broccoli-source "^3.0.0" + debug "^3.1.0" + ember-cli-babel "^7.0.0" + enhanced-resolve "^4.0.0" + fs-extra "^6.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.3.1" + js-string-escape "^1.0.1" + lodash "^4.17.19" + mkdirp "^0.5.1" + resolve-package-path "^3.1.0" + rimraf "^2.6.2" + semver "^7.3.4" + symlink-or-copy "^1.2.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^0.3.3" + webpack "^4.43.0" + +ember-auto-import@^1.2.19, ember-auto-import@^1.5.2, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: version "1.10.1" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.10.1.tgz#6c93a875e494aa0a58b759867d3f20adfd514ae3" integrity sha512-7bOWzPELlVwdWDOkB+phDIjg8BNW+/2RiLLQ+Xa/eIvCLT4ABYhHV5wqW5gs5BnXTDVLfE4ddKZdllnGuPGGDQ== From e5af82ba99110ed28e0292a418beb148e928cd35 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:49:19 +0100 Subject: [PATCH 0075/3032] Update dependency @tryghost/kg-clean-basic-html to v1.0.16 (#1888) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 77b7fe378c..8f1d62a9f6 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "1.0.0", "@tryghost/helpers": "1.1.41", - "@tryghost/kg-clean-basic-html": "1.0.11", + "@tryghost/kg-clean-basic-html": "1.0.16", "@tryghost/kg-parser-plugins": "1.1.6", "@tryghost/limit-service": "0.4.0", "@tryghost/members-csv": "0.4.5", diff --git a/yarn.lock b/yarn.lock index 8401c4900b..46d2d205cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1767,12 +1767,7 @@ dependencies: lodash-es "^4.17.11" -"@tryghost/kg-clean-basic-html@1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.11.tgz#3dc7f5e0d425f2b141022d454ebde3d90bd5adc6" - integrity sha512-dxc8eRzBzOjjuA15oWGOR+QGs3YWF9vA5ZyZUfDbv/EFg7m/6DJ2iz41hU5hOdH7W0pE06x61TlV+lETkoCqIA== - -"@tryghost/kg-clean-basic-html@^1.0.16": +"@tryghost/kg-clean-basic-html@1.0.16", "@tryghost/kg-clean-basic-html@^1.0.16": version "1.0.16" resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.16.tgz#223450ae1726a9bf91b1918281d3e6b89df434a6" integrity sha512-4LJL1ue9BgmPPOO1/4xhp6E0ta2nE85V0vkxeNRxpun/zOC3EQP7hf2U6rYoZ6yz1fa+h7Yjvv9309q+zgzRCA== From 84b70f8e56a6432649bd8c5766bc270283ccd455 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:49:28 +0100 Subject: [PATCH 0076/3032] Update dependency @tryghost/limit-service to v0.4.1 (#1890) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 8f1d62a9f6..f7631c7bf5 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@tryghost/helpers": "1.1.41", "@tryghost/kg-clean-basic-html": "1.0.16", "@tryghost/kg-parser-plugins": "1.1.6", - "@tryghost/limit-service": "0.4.0", + "@tryghost/limit-service": "0.4.1", "@tryghost/members-csv": "0.4.5", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.17", diff --git a/yarn.lock b/yarn.lock index 46d2d205cf..db09a74945 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1779,10 +1779,10 @@ dependencies: "@tryghost/kg-clean-basic-html" "^1.0.16" -"@tryghost/limit-service@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-0.4.0.tgz#a681eb866171a6966162db87ae0d18ccb1fbb965" - integrity sha512-DVWYiKgvXzWqi+L2jJPhTQLogiRZUJw+bX9XMmLg202rnNAn8A9eYIAmWu5TbY4Gp0+6gz6IZFdIIocGDtA8Aw== +"@tryghost/limit-service@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-0.4.1.tgz#c827e8a334854766f073520ae5dab12e132e0945" + integrity sha512-MYcW+s4+OfA9C/tI7e0ZKhxUk02tVhkcrBc/7p+BgiJnS+LdcgrV21xRqH/UhERotgOLcFRTHPt6bkqW1Lnhwg== dependencies: lodash "^4.17.21" From 3cbf23d1e1274c98fd12f9fcded88712e9a68084 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:49:36 +0100 Subject: [PATCH 0077/3032] Update dependency @tryghost/timezone-data to v0.2.39 (#1893) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f7631c7bf5..3ff6838446 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@tryghost/members-csv": "0.4.5", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.17", - "@tryghost/timezone-data": "0.2.35", + "@tryghost/timezone-data": "0.2.39", "autoprefixer": "9.8.6", "babel-eslint": "10.1.0", "blueimp-md5": "2.18.0", diff --git a/yarn.lock b/yarn.lock index db09a74945..5f2834469d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1808,10 +1808,10 @@ dependencies: unidecode "^0.1.8" -"@tryghost/timezone-data@0.2.35": - version "0.2.35" - resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.35.tgz#03214aa9c110a86505b4badd6ed3b5ae253ffcc2" - integrity sha512-Is5VeAaI/Pt6nJUJwt53R8uohhHPgTN/2u5GkqQBeQbmuAnN37qy4+SS6yixJqiGy6Zk9Gm7Qr3btBAD15p3FA== +"@tryghost/timezone-data@0.2.39": + version "0.2.39" + resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.39.tgz#1653a18421eb22af7e7d86a7e2007cff9ce63e6e" + integrity sha512-22qY7xvNYEa6BUu7IKG7wbUETN/RDrVyRr9NQkzeip7q0qLvShFXeoMOULmXri2JP627uBW9Y2WGi9DSnIegMw== "@types/acorn@^4.0.3": version "4.0.5" From 23d2523e8c0d4151a3495d0a3d62f60496cbd346 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 08:50:08 +0100 Subject: [PATCH 0078/3032] Update dependency ember-cli-mirage to v2.1.0 (#1898) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 77 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 3ff6838446..35e9a65173 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "ember-cli-eslint": "5.1.0", "ember-cli-htmlbars": "5.3.1", "ember-cli-inject-live-reload": "2.0.2", - "ember-cli-mirage": "2.0.1", + "ember-cli-mirage": "2.1.0", "ember-cli-moment-shim": "3.8.0", "ember-cli-node-assets": "0.2.2", "ember-cli-postcss": "6.0.1", diff --git a/yarn.lock b/yarn.lock index 5f2834469d..3e3c54c8ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1475,6 +1475,45 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" +"@embroider/core@0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.37.0.tgz#bd7a7d63795794ffcd53d90a65b81e939ccf6cff" + integrity sha512-tkXD7qV9GJYb7cGlxLT4PTbPZ+B4vNDXp5oHyEz8EQSuZExN/40Hm90S5KrEC++TpqeVewSIXOz/fA53lkK6RQ== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.37.0" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-node-api "^1.7.0" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.1" + broccoli-source "^3.0.0" + debug "^3.1.0" + escape-string-regexp "^4.0.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.4.2" + js-string-escape "^1.0.1" + jsdom "^16.4.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^7.3.2" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" + "@embroider/macros@0.24.1", "@embroider/macros@^0.24.1": version "0.24.1" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.24.1.tgz#0ab11b88d148f35c91f438f0b44f96fbf1607a9b" @@ -1505,7 +1544,7 @@ resolve "^1.8.1" semver "^7.3.2" -"@embroider/macros@0.33.0", "@embroider/macros@^0.33.0": +"@embroider/macros@0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" integrity sha512-nl/1zRn+Wd3MO8Bb+YPqHmFl/2vwQLTsEB6Zt+K9bWXsM/kA+dPCeeCReLN6PbkMP16xxqtNSIrQ8Y49hnWjpg== @@ -1520,6 +1559,21 @@ resolve "^1.8.1" semver "^7.3.2" +"@embroider/macros@0.37.0", "@embroider/macros@^0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.37.0.tgz#221013fc5bc0eaa78f1de98802fc03e588bfe1b1" + integrity sha512-VItxn4NzGR5prryXGbPGTuLMd+QPPKvAYZv2357iS+wmz6mTzC5nqXljwDQIOJbAji9giDO+FW2HzXYOcY3teQ== + dependencies: + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.37.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" + semver "^7.3.2" + "@eslint/eslintrc@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" @@ -6147,19 +6201,19 @@ ember-cli-lodash-subset@^2.0.1: resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= -ember-cli-mirage@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-mirage/-/ember-cli-mirage-2.0.1.tgz#3851c3691f66769ab55c13a2557e69c85ad66b23" - integrity sha512-zOepXLwuV4G+DZHQE3h62QQGARtwvgG+Glry+fySQ8VbCo3v/jh8l1JJIluUpPkEVyEyuGHIbjKqi/yQsSjm4Q== +ember-cli-mirage@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-mirage/-/ember-cli-mirage-2.1.0.tgz#5709f2b25bb4c9bc9c246178cd6405271229b18c" + integrity sha512-Qn8KOySYVntl1q5Tk0zTYb4vZYHRpNBmTL0M+scIw+PVKYr/UZYFyTfDkGEs3f85EliY58po3o2oY4OEXsHiaw== dependencies: - "@embroider/macros" "^0.33.0" + "@embroider/macros" "^0.37.0" broccoli-file-creator "^2.1.1" broccoli-funnel "^3.0.3" broccoli-merge-trees "^4.2.0" ember-auto-import "^1.2.19" ember-cli-babel "^7.5.0" ember-get-config "^0.2.4 || ^0.3.0" - ember-inflector "^2.0.0 || ^3.0.0" + ember-inflector "^2.0.0 || ^3.0.0 || ^4.0.0" lodash-es "^4.17.11" miragejs "^0.1.31" @@ -6703,7 +6757,14 @@ ember-infinity@2.1.2: ember-cli-htmlbars "^3.0.1" ember-in-viewport "~3.7.2" -"ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.1: +"ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.1.tgz#e0aa9e39119156a278c80bb8cdec8462ecb8e6ab" + integrity sha512-D14nH2wVMp13ciOONcHMXwdL/IoMBSDXsGObF2rsQX7F8vGjwp+jnSNzZuGjjIvlBFQydOJ+R2n86J2e8HRTQA== + dependencies: + ember-cli-babel "^7.23.0" + +ember-inflector@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== From a05fdb24b03fad6e838ad55daac51d32e7f57c73 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 09:11:17 +0100 Subject: [PATCH 0079/3032] Update dependency ember-cli-babel to v7.26.3 (#1896) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 65 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 35e9a65173..aaaa00a858 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "ember-classic-decorator": "2.0.0", "ember-cli": "3.21.2", "ember-cli-app-version": "4.0.0", - "ember-cli-babel": "7.23.0", + "ember-cli-babel": "7.26.3", "ember-cli-chart": "3.7.2", "ember-cli-dependency-checker": "3.2.0", "ember-cli-deprecation-workflow": "1.0.1", diff --git a/yarn.lock b/yarn.lock index 3e3c54c8ad..d6d8a9da7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5937,35 +5937,36 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.23.0, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.23.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" - integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== +ember-cli-babel@7.26.3: + version "7.26.3" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.3.tgz#e93ce7ec458208894d10844cf76e41cc06fdbeb6" + integrity sha512-ZCs0g99d3kYaHs1+HT33oMY7/K+nLCAAv7dCLxsMzg7cQf55O6Pq4ZKnWEr3IHVs33xbJFnEb9prt1up36QVnw== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" - "@babel/plugin-proposal-class-properties" "^7.10.4" - "@babel/plugin-proposal-decorators" "^7.10.5" - "@babel/plugin-transform-modules-amd" "^7.10.5" - "@babel/plugin-transform-runtime" "^7.12.0" - "@babel/plugin-transform-typescript" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" "@babel/polyfill" "^7.11.5" "@babel/preset-env" "^7.12.0" - "@babel/runtime" "^7.12.0" - amd-name-resolver "^1.2.1" - babel-plugin-debug-macros "^0.3.3" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.2.0" - babel-plugin-module-resolver "^3.1.1" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" broccoli-babel-transpiler "^7.8.0" broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" - broccoli-source "^1.1.0" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" clone "^2.1.2" ember-cli-babel-plugin-helpers "^1.1.1" ember-cli-version-checker "^4.1.0" ensure-posix-path "^1.0.2" fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" rimraf "^3.0.1" semver "^5.5.0" @@ -5988,6 +5989,38 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: + version "7.23.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.0.tgz#ec580aa2c115d0810e454dd5c2fffce238284b92" + integrity sha512-ix58DlRDAbGITtdJoRUPcAoQwKLYr/x/kIXjU9u1ATyhmuUjqb+0FDXghOWbkNihGiNOqBBR49+LBgK9AeBcNw== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-decorators" "^7.10.5" + "@babel/plugin-transform-modules-amd" "^7.10.5" + "@babel/plugin-transform-runtime" "^7.12.0" + "@babel/plugin-transform-typescript" "^7.12.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "^7.12.0" + amd-name-resolver "^1.2.1" + babel-plugin-debug-macros "^0.3.3" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.2.0" + babel-plugin-module-resolver "^3.1.1" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" + broccoli-source "^1.1.0" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + rimraf "^3.0.1" + semver "^5.5.0" + ember-cli-babel@^7.23.1: version "7.26.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.2.tgz#497985e741ffcc08f89f98c9464509e91cdb2809" From 3ccce2c2ae735a5eefe67acbeebe090bc7a15f18 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 09:11:29 +0100 Subject: [PATCH 0080/3032] Update dependency ember-cli-htmlbars to v5.7.1 (#1897) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 225 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 216 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index aaaa00a858..f916d711f6 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "ember-cli-dependency-checker": "3.2.0", "ember-cli-deprecation-workflow": "1.0.1", "ember-cli-eslint": "5.1.0", - "ember-cli-htmlbars": "5.3.1", + "ember-cli-htmlbars": "5.7.1", "ember-cli-inject-live-reload": "2.0.2", "ember-cli-mirage": "2.1.0", "ember-cli-moment-shim": "3.8.0", diff --git a/yarn.lock b/yarn.lock index d6d8a9da7d..efb4e1a602 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2930,6 +2930,17 @@ babel-plugin-htmlbars-inline-precompile@^4.2.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.2.1.tgz#9a367f8d7ecb9fb2c2e886edfe285caf7cb9766d" integrity sha512-MCJXk+1R0YjlF/F52eDbhJTpsnqRVYsPYVP9d0jEu7E46AcRPEWDL5tfSweiQWHLKG017BIedATb91KcIoT3zA== +babel-plugin-htmlbars-inline-precompile@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.2.2.tgz#3ebd5c365f5c64ba737c764603c12d6a85ba3024" + integrity sha512-ta4FRkdF3iaPwJ4e3bLNa52VuYRSSezYo1ezx/A9sJg+C3ByjroTCXby/zc4oeq0/so+Dbi4jXie6h8f+RowMQ== + dependencies: + babel-plugin-ember-modules-api-polyfill "^3.5.0" + line-column "^1.0.2" + magic-string "^0.25.7" + parse-static-imports "^1.1.0" + string.prototype.matchall "^4.0.4" + babel-plugin-module-resolver@^3.1.1, babel-plugin-module-resolver@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" @@ -6150,23 +6161,24 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" -ember-cli-htmlbars@5.3.1, ember-cli-htmlbars@^5.1.2, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.3.1.tgz#61793964fc2599ce750db9e972ab55c6dd177c48" - integrity sha512-ZjQTt44euDoqLvUkWbt1svgNCXgLzOztEbc2qqYMQvhQig416LMrWK7l3SSbNU+BtLD5UIxmwvLfF1tsO2CVyA== +ember-cli-htmlbars@5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" + integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== dependencies: "@ember/edition-utils" "^1.2.0" - babel-plugin-htmlbars-inline-precompile "^4.2.0" + babel-plugin-htmlbars-inline-precompile "^5.0.0" broccoli-debug "^0.6.5" - broccoli-persistent-filter "^3.1.0" + broccoli-persistent-filter "^3.1.2" broccoli-plugin "^4.0.3" common-tags "^1.8.0" - ember-cli-babel-plugin-helpers "^1.1.0" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^5.1.2" fs-tree-diff "^2.0.1" hash-for-dep "^1.5.1" heimdalljs-logger "^0.1.10" json-stable-stringify "^1.0.1" - semver "^7.3.2" + semver "^7.3.4" silent-error "^1.1.1" strip-bom "^4.0.0" walk-sync "^2.2.0" @@ -6211,6 +6223,27 @@ ember-cli-htmlbars@^4.2.0, ember-cli-htmlbars@^4.2.3, ember-cli-htmlbars@^4.3.1: strip-bom "^4.0.0" walk-sync "^2.0.2" +ember-cli-htmlbars@^5.1.2, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.3.1.tgz#61793964fc2599ce750db9e972ab55c6dd177c48" + integrity sha512-ZjQTt44euDoqLvUkWbt1svgNCXgLzOztEbc2qqYMQvhQig416LMrWK7l3SSbNU+BtLD5UIxmwvLfF1tsO2CVyA== + dependencies: + "@ember/edition-utils" "^1.2.0" + babel-plugin-htmlbars-inline-precompile "^4.2.0" + broccoli-debug "^0.6.5" + broccoli-persistent-filter "^3.1.0" + broccoli-plugin "^4.0.3" + common-tags "^1.8.0" + ember-cli-babel-plugin-helpers "^1.1.0" + fs-tree-diff "^2.0.1" + hash-for-dep "^1.5.1" + heimdalljs-logger "^0.1.10" + json-stable-stringify "^1.0.1" + semver "^7.3.2" + silent-error "^1.1.1" + strip-bom "^4.0.0" + walk-sync "^2.2.0" + ember-cli-import-polyfill@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" @@ -7350,6 +7383,28 @@ es-abstract@^1.18.0-next.1: string.prototype.trimend "^1.0.3" string.prototype.trimstart "^1.0.3" +es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -8524,6 +8579,15 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -8849,6 +8913,11 @@ has-ansi@^3.0.0: dependencies: ansi-regex "^3.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-binary2@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" @@ -8881,6 +8950,11 @@ has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" @@ -9307,6 +9381,15 @@ inquirer@^7.0.0, inquirer@^7.3.3: strip-ansi "^6.0.0" through "^2.3.6" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + interpret@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -9379,6 +9462,11 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -9393,6 +9481,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -9403,6 +9498,11 @@ is-callable@^1.1.4, is-callable@^1.2.2: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== +is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" @@ -9532,6 +9632,11 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -9590,6 +9695,14 @@ is-regex@^1.1.1: dependencies: has-symbols "^1.0.1" +is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + is-relative@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" @@ -9617,6 +9730,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -9624,7 +9742,7 @@ is-svg@^3.0.0: dependencies: html-comment-regex "^1.1.0" -is-symbol@^1.0.2: +is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== @@ -10040,6 +10158,14 @@ liftoff@~2.5.0: rechoir "^0.6.2" resolve "^1.1.7" +line-column@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" + integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI= + dependencies: + isarray "^1.0.0" + isobject "^2.0.0" + linkify-it@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" @@ -10510,6 +10636,13 @@ magic-string@^0.24.0: dependencies: sourcemap-codec "^1.4.1" +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -11651,6 +11784,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse-static-imports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parse-static-imports/-/parse-static-imports-1.1.0.tgz#ae2f18f18da1a993080ae406a5219455c0bbad5d" + integrity sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA== + parse5@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" @@ -12599,6 +12737,14 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -13167,6 +13313,15 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -13424,7 +13579,7 @@ source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sourcemap-codec@^1.4.1: +sourcemap-codec@^1.4.1, sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -13595,6 +13750,19 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.matchall@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" + integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has-symbols "^1.0.1" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" @@ -13603,6 +13771,14 @@ string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: call-bind "^1.0.0" define-properties "^1.1.3" +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" @@ -13611,6 +13787,14 @@ string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: call-bind "^1.0.0" define-properties "^1.1.3" +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -14247,6 +14431,16 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.4.tgz#93de48bb76bb3ec0fc36563f871ba46e2ee5c7ee" integrity sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A== +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -14734,6 +14928,17 @@ whatwg-url@^8.0.0: tr46 "^2.0.2" webidl-conversions "^6.1.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which@^1.2.14, which@^1.2.9, which@^1.3.0, which@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" From 3f362d6d039556519a04b25699e7fde57d2900c9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 09:11:58 +0100 Subject: [PATCH 0081/3032] Update dependency ember-simple-auth to v3.1.0 (#1901) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f916d711f6..0d44424a1a 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "ember-power-select": "4.1.0", "ember-resolver": "8.0.2", "ember-route-action-helper": "2.0.8", - "ember-simple-auth": "3.0.1", + "ember-simple-auth": "3.1.0", "ember-sinon": "5.0.0", "ember-source": "3.21.3", "ember-svg-jar": "2.2.3", diff --git a/yarn.lock b/yarn.lock index efb4e1a602..63329cbdac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7053,10 +7053,10 @@ ember-router-generator@^2.0.0: "@babel/traverse" "^7.4.5" recast "^0.18.1" -ember-simple-auth@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-simple-auth/-/ember-simple-auth-3.0.1.tgz#78bcd8e3d04da43154cf105931c0d3620a9f0694" - integrity sha512-7D5s23nA5Nsonf37CyeQtksadV6Rgiz2rgCgRDnUObp3xnV71ljPtaUcZuq6kqqaZANYJi3uM8i4zVzmAHlKFQ== +ember-simple-auth@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-simple-auth/-/ember-simple-auth-3.1.0.tgz#e8abe27f6c3c44f46ebacace57364e82223bab9a" + integrity sha512-JS8NtYAlSftkoQh36Kxps6iLHTP/InIgKt8w21QBHCTqDx07af4aka59GojaBvc+8GubQuGKldk6vvw3R8bwxA== dependencies: base-64 "^0.1.0" broccoli-file-creator "^2.0.0" From a5ad2651e01c62eb71d253c0d1c64c657e01a4ae Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 12 Apr 2021 11:15:09 +0100 Subject: [PATCH 0082/3032] Fixed role validation when inviting new users no issue - the `role` argument was not being passed to the `validateRole` method when changing roles --- app/components/gh-role-selection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/gh-role-selection.js b/app/components/gh-role-selection.js index 1a215d5078..20157842b6 100644 --- a/app/components/gh-role-selection.js +++ b/app/components/gh-role-selection.js @@ -18,7 +18,7 @@ export default class GhRoleSelectionComponent extends Component { async setRole(roleName) { const role = this.roles.findBy('name', roleName); this.args.setRole(role); - return this.validateRole(); + return this.validateRole(role); } @task From a086b7800e5dbda63eb9e2bafcab728159d3eea3 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 12 Apr 2021 11:27:37 +0100 Subject: [PATCH 0083/3032] Fixed initial role selection and layout shift in no issue - initial role was always being set to Contributor due to incorrect argument being used when checking if the default role should be applied - there was considerable layout shift of the `` container after role loading was finished, quick-fix applied by specifying a width and height to the loading spinner container that matches the final width/height --- app/components/gh-role-selection.hbs | 5 ++++- app/components/gh-role-selection.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/components/gh-role-selection.hbs b/app/components/gh-role-selection.hbs index f520c79999..a9fd5eff5e 100644 --- a/app/components/gh-role-selection.hbs +++ b/app/components/gh-role-selection.hbs @@ -1,6 +1,9 @@
    {{#if this.fetchRolesTask.isRunning}} - + {{!-- width and height are needed to avoid layout shift after roles have loaded --}} +
    + +
    {{else}}
    diff --git a/app/components/gh-role-selection.js b/app/components/gh-role-selection.js index 20157842b6..8722f858bf 100644 --- a/app/components/gh-role-selection.js +++ b/app/components/gh-role-selection.js @@ -28,7 +28,7 @@ export default class GhRoleSelectionComponent extends Component { this.roles = roles; - if (!this.args.role && defaultRole) { + if (!this.args.selected && defaultRole) { this.args.setRole(defaultRole); } } From 96964f6ccaa502e040cea7c17e84513a09e61f2b Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 12 Apr 2021 11:35:50 +0100 Subject: [PATCH 0084/3032] Swapped staff role selector from `` input for changing a user's role with a button that triggers the role selection modal - role is not set unless the "Set role" button is clicked after making a selection, cancel or close will leave the original role selected --- app/components/modal-select-user-role.hbs | 16 ++++++++++ app/components/modal-select-user-role.js | 39 +++++++++++++++++++++++ app/controllers/staff/user.js | 8 ++++- app/templates/staff/user.hbs | 20 ++++++------ 4 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 app/components/modal-select-user-role.hbs create mode 100644 app/components/modal-select-user-role.js diff --git a/app/components/modal-select-user-role.hbs b/app/components/modal-select-user-role.hbs new file mode 100644 index 0000000000..d58c53c826 --- /dev/null +++ b/app/components/modal-select-user-role.hbs @@ -0,0 +1,16 @@ + +{{svg-jar "close"}} + + + + diff --git a/app/components/modal-select-user-role.js b/app/components/modal-select-user-role.js new file mode 100644 index 0000000000..4ece7edfba --- /dev/null +++ b/app/components/modal-select-user-role.js @@ -0,0 +1,39 @@ +import ModalBase from 'ghost-admin/components/modal-base'; +import classic from 'ember-classic-decorator'; +import {action} from '@ember/object'; +import {tracked} from '@glimmer/tracking'; + +// TODO: update modals to work fully with Glimmer components +@classic +export default class ModalPostPreviewComponent extends ModalBase { + @tracked role; + + // TODO: rename to confirm() when modals have full Glimmer support + @action + confirmAction() { + this.confirm(this.role); + this.close(); + } + + @action + close(event) { + event?.preventDefault?.(); + this.closeModal(); + } + + @action + setRoleFromModel() { + this.role = this.model; + } + + actions = { + confirm() { + this.confirmAction(...arguments); + }, + + // needed because ModalBase uses .send() for keyboard events + closeModal() { + this.args.close(); + } + } +} diff --git a/app/controllers/staff/user.js b/app/controllers/staff/user.js index 50176e2aac..d82e5089fc 100644 --- a/app/controllers/staff/user.js +++ b/app/controllers/staff/user.js @@ -28,8 +28,9 @@ export default Controller.extend({ showSuspendUserModal: false, showTransferOwnerModal: false, showUploadCoverModal: false, - showUplaodImageModal: false, + showUploadImageModal: false, showRegenerateTokenModal: false, + showRoleSelectionModal: false, _scratchFacebook: null, _scratchTwitter: null, @@ -82,6 +83,11 @@ export default Controller.extend({ }), actions: { + toggleRoleSelectionModal(event) { + event?.preventDefault?.(); + this.toggleProperty('showRoleSelectionModal'); + }, + changeRole(newRole) { this.user.set('role', newRole); this.set('dirtyAttributes', true); diff --git a/app/templates/staff/user.hbs b/app/templates/staff/user.hbs index d51e47d581..dcac6670f4 100644 --- a/app/templates/staff/user.hbs +++ b/app/templates/staff/user.hbs @@ -190,18 +190,18 @@ {{#if this.rolesDropdownIsVisible}}
    - - - +
    {{this.user.role.name}}

    What permissions should this user have?

    + + {{#if this.showRoleSelectionModal}} + + {{/if}} {{/if}} From 96943a9d935f905fe5a3a33188213e4b45cf840d Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Mon, 12 Apr 2021 14:09:24 +0200 Subject: [PATCH 0085/3032] Updated styles for change-user-role modal --- app/components/modal-select-user-role.hbs | 4 +-- app/styles/layouts/users.css | 32 +++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/components/modal-select-user-role.hbs b/app/components/modal-select-user-role.hbs index d58c53c826..bbe6ca1728 100644 --- a/app/components/modal-select-user-role.hbs +++ b/app/components/modal-select-user-role.hbs @@ -1,5 +1,5 @@ {{svg-jar "close"}} @@ -12,5 +12,5 @@ diff --git a/app/styles/layouts/users.css b/app/styles/layouts/users.css index d20e797da3..47e1e9ccbd 100644 --- a/app/styles/layouts/users.css +++ b/app/styles/layouts/users.css @@ -152,18 +152,18 @@ max-width: 600px; } -.invite-new-user .form-group { +.gh-roles-container .form-group { margin-bottom: 0; padding: 0; } -.invite-new-user .form-group label { +.gh-roles-container .form-group label { position: static; display: block; text-align: left; } -.invite-new-user .form-group input { +.gh-roles-container .form-group input { width: 100%; } @@ -181,67 +181,67 @@ font-weight: 400; } -.invite-new-user .gh-radio { +.gh-roles-container .gh-radio { padding-bottom: 20px; border-bottom: 1px solid var(--list-color-divider); } -.invite-new-user .gh-radio:first-child { +.gh-roles-container .gh-radio:first-child { padding-top: 20px; border-top: 1px solid var(--list-color-divider); } -.invite-new-user .gh-radio:last-child { +.gh-roles-container .gh-radio:last-child { margin: 0; } -.invite-new-user .gh-radio svg { +.gh-roles-container .gh-radio svg { width: 16px; height: 16px; fill: var(--midgrey); margin-left: 2px; } -.invite-new-user .gh-radio-content { +.gh-roles-container .gh-radio-content { margin-right: 2.4rem; } -.invite-new-user .gh-radio-label { +.gh-roles-container .gh-radio-label { padding-bottom: 4px; line-height: 1.1em; font-weight: 600; } -.invite-new-user .gh-radio-desc { +.gh-roles-container .gh-radio-desc { color: var(--midgrey); font-size: 1.3rem; line-height: 1.2em; font-weight: 400; } -.invite-new-user .popover { +.gh-roles-container .popover { width: 97%; border: 1px solid var(--whitegrey-d1); color: var(--darkgrey); box-shadow: var(--shadow-3); } -.invite-new-user .popover-arrow { +.gh-roles-container .popover-arrow { display: none; } -.invite-new-user .popover table { +.gh-roles-container .popover table { margin: .6em 0; } -.invite-new-user .popover td.left { +.gh-roles-container .popover td.left { padding-right: 16px; font-weight: 600; white-space: nowrap; } -.invite-new-user .gh-btn-black, -.invite-new-user .gh-btn-green { +.gh-roles-container .gh-btn-black, +.gh-roles-container .gh-btn-green { margin: 0; width: 100%; } From 6f66d808e334ee44b03f01919af8ffaff3d55732 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 12 Apr 2021 13:21:57 +0100 Subject: [PATCH 0086/3032] Removed usage of deprecated EmberSimpleAuth mixins (#1910) refs https://github.com/TryGhost/Admin/pull/1901 Ember has deprecated mixins in preparation for 4.0 and `ember-simple-auth` has now done the same in 3.1.0. - removed all imports of Ember Simple Auth mixins - moved authenticated and invalidated handling from application route to session service - moved server-notification loading from application route to session service - updated `AuthenticatedRoute` to use the session service directly rather than authenticated route mixin - added `UnauthenticatedRoute` that incorporates the behaviour from our overridden `UnauthenticatedRouteMixin` and switches to using the session service directly --- app/adapters/base.js | 3 +- app/controllers/setup/three.js | 5 +- app/mixins/unauthenticated-route-mixin.js | 35 -------------- app/routes/application.js | 58 ++--------------------- app/routes/authenticated.js | 10 ++-- app/routes/reset.js | 11 +---- app/routes/signin.js | 12 ++--- app/routes/signup.js | 11 +---- app/routes/unauthenticated.js | 29 ++++++++++++ app/services/session.js | 53 +++++++++++++++++++++ 10 files changed, 107 insertions(+), 120 deletions(-) delete mode 100644 app/mixins/unauthenticated-route-mixin.js create mode 100644 app/routes/unauthenticated.js diff --git a/app/adapters/base.js b/app/adapters/base.js index 02f524e889..c3215636f1 100644 --- a/app/adapters/base.js +++ b/app/adapters/base.js @@ -1,10 +1,9 @@ import AjaxServiceSupport from 'ember-ajax/mixins/ajax-support'; -import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; import RESTAdapter from '@ember-data/adapter/rest'; import ghostPaths from 'ghost-admin/utils/ghost-paths'; import {inject as service} from '@ember/service'; -export default RESTAdapter.extend(DataAdapterMixin, AjaxServiceSupport, { +export default RESTAdapter.extend(AjaxServiceSupport, { host: window.location.origin, namespace: ghostPaths().apiRoot.slice(1), diff --git a/app/controllers/setup/three.js b/app/controllers/setup/three.js index 12432bac7b..9e3973d390 100644 --- a/app/controllers/setup/three.js +++ b/app/controllers/setup/three.js @@ -20,6 +20,7 @@ const {Errors} = DS; export default Controller.extend({ two: controller('setup/two'), notifications: service(), + session: service(), users: '', @@ -123,7 +124,7 @@ export default Controller.extend({ }, skipInvite() { - this.send('loadServerNotifications'); + this.session.loadServerNotifications(); this.transitionToRoute('home'); } }, @@ -176,7 +177,7 @@ export default Controller.extend({ this._showNotifications(invites); run.schedule('actions', this, function () { - this.send('loadServerNotifications'); + this.session.loadServerNotifications(); this._transitionAfterSubmission(); }); } else if (users.length === 0) { diff --git a/app/mixins/unauthenticated-route-mixin.js b/app/mixins/unauthenticated-route-mixin.js deleted file mode 100644 index c4fe581e6e..0000000000 --- a/app/mixins/unauthenticated-route-mixin.js +++ /dev/null @@ -1,35 +0,0 @@ -import Mixin from '@ember/object/mixin'; -import {inject as service} from '@ember/service'; - -export default Mixin.create({ - - ajax: service(), - ghostPaths: service(), - session: service(), - - routeIfAlreadyAuthenticated: 'home', - - beforeModel() { - let authUrl = this.get('ghostPaths.url').api('authentication', 'setup'); - - // check the state of the setup process via the API - return this.ajax.request(authUrl).then((result) => { - let [setup] = result.setup; - - if (setup.status !== true) { - this.transitionTo('setup'); - } else { - // NOTE: this is the same as ESA's UnauthenticatedRouteMixin, - // adding that mixin to this and calling _super wasn't calling - // the ESA mixin's beforeModel method - if (this.session.get('isAuthenticated')) { - let routeIfAlreadyAuthenticated = this.routeIfAlreadyAuthenticated; - - return this.transitionTo(routeIfAlreadyAuthenticated); - } else { - return this._super(...arguments); - } - } - }); - } -}); diff --git a/app/routes/application.js b/app/routes/application.js index 8c9d748347..1eae06163b 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -1,4 +1,3 @@ -import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin'; import AuthConfiguration from 'ember-simple-auth/configuration'; import RSVP from 'rsvp'; import Route from '@ember/routing/route'; @@ -15,7 +14,6 @@ import { isMaintenanceError, isVersionMismatchError } from 'ghost-admin/services/ajax'; -import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; function K() { @@ -27,13 +25,14 @@ let shortcuts = {}; shortcuts.esc = {action: 'closeMenus', scope: 'default'}; shortcuts[`${ctrlOrCmd}+s`] = {action: 'save', scope: 'all'}; -export default Route.extend(ApplicationRouteMixin, ShortcutsRoute, { +export default Route.extend(ShortcutsRoute, { ajax: service(), config: service(), feature: service(), ghostPaths: service(), notifications: service(), router: service(), + session: service(), settings: service(), ui: service(), whatsNew: service(), @@ -57,8 +56,8 @@ export default Route.extend(ApplicationRouteMixin, ShortcutsRoute, { this._super(...arguments); if (this.get('session.isAuthenticated')) { - this.set('appLoadTransition', transition); - transition.send('loadServerNotifications'); + this.session.appLoadTransition = transition; + this.session.loadServerNotifications(); // return the feature/settings load promises so that we block until // they are loaded to enable synchronous access everywhere @@ -87,37 +86,14 @@ export default Route.extend(ApplicationRouteMixin, ShortcutsRoute, { }, didTransition() { - this.set('appLoadTransition', null); + this.session.appLoadTransition = null; this.send('closeMenus'); }, - signedIn() { - this.notifications.clearAll(); - this.send('loadServerNotifications', true); - }, - authorizationFailed() { windowProxy.replaceLocation(AuthConfiguration.rootURL); }, - loadServerNotifications(isDelayed) { - if (this.get('session.isAuthenticated')) { - this.get('session.user').then((user) => { - if (!user.get('isAuthorOrContributor')) { - this.store.findAll('notification', {reload: true}).then((serverNotifications) => { - serverNotifications.forEach((notification) => { - if (notification.get('top') || notification.get('custom')) { - this.notifications.handleNotification(notification, isDelayed); - } else { - this.upgradeStatus.handleUpgradeNotification(notification); - } - }); - }); - } - }); - } - }, - // noop default for unhandled save (used from shortcuts) save: K, @@ -183,29 +159,5 @@ export default Route.extend(ApplicationRouteMixin, ShortcutsRoute, { // fallback to 500 error page return true; } - }, - - sessionAuthenticated() { - if (this.get('session.skipAuthSuccessHandler')) { - return; - } - - // standard ESA post-sign-in redirect - this._super(...arguments); - - // trigger post-sign-in background behaviour - this.get('session.user').then((user) => { - this.send('signedIn', user); - }); - }, - - sessionInvalidated() { - let transition = this.appLoadTransition; - - if (transition) { - transition.send('authorizationFailed'); - } else { - run.scheduleOnce('routerTransitions', this, 'send', 'authorizationFailed'); - } } }); diff --git a/app/routes/authenticated.js b/app/routes/authenticated.js index 175d4a108b..5d79c28ca6 100644 --- a/app/routes/authenticated.js +++ b/app/routes/authenticated.js @@ -1,6 +1,10 @@ -import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; import Route from '@ember/routing/route'; +import {inject as service} from '@ember/service'; -export default Route.extend(AuthenticatedRouteMixin, { - authenticationRoute: 'signin' +export default Route.extend({ + session: service(), + + beforeModel(transition) { + this.session.requireAuthentication(transition, 'signin'); + } }); diff --git a/app/routes/reset.js b/app/routes/reset.js index f842579ea7..09e2790509 100644 --- a/app/routes/reset.js +++ b/app/routes/reset.js @@ -1,8 +1,7 @@ -import Route from '@ember/routing/route'; -import UnauthenticatedRouteMixin from 'ghost-admin/mixins/unauthenticated-route-mixin'; +import UnauthenticatedRoute from 'ghost-admin/routes/unauthenticated'; import {inject as service} from '@ember/service'; -export default Route.extend(UnauthenticatedRouteMixin, { +export default UnauthenticatedRoute.extend({ notifications: service(), session: service(), @@ -22,11 +21,5 @@ export default Route.extend(UnauthenticatedRouteMixin, { deactivate() { this._super(...arguments); this.controller.clearData(); - }, - - buildRouteInfoMetadata() { - return { - bodyClasses: ['unauthenticated-route'] - }; } }); diff --git a/app/routes/signin.js b/app/routes/signin.js index 8c6ac751cd..a6bd78fc14 100644 --- a/app/routes/signin.js +++ b/app/routes/signin.js @@ -2,8 +2,7 @@ // eslint-disable-next-line import DS from 'ember-data'; import EmberObject from '@ember/object'; -import Route from '@ember/routing/route'; -import UnauthenticatedRouteMixin from 'ghost-admin/mixins/unauthenticated-route-mixin'; +import UnauthenticatedRoute from 'ghost-admin/routes/unauthenticated'; const {Errors} = DS; @@ -15,7 +14,7 @@ const defaultModel = function defaultModel() { }); }; -export default Route.extend(UnauthenticatedRouteMixin, { +export default UnauthenticatedRoute.extend({ model() { return defaultModel(); }, @@ -31,9 +30,8 @@ export default Route.extend(UnauthenticatedRouteMixin, { }, buildRouteInfoMetadata() { - return { - titleToken: 'Sign In', - bodyClasses: ['unauthenticated-route'] - }; + return Object.assign(this._super(), { + titleToken: 'Sign In' + }); } }); diff --git a/app/routes/signup.js b/app/routes/signup.js index 7f20e83c24..8446ef35e5 100644 --- a/app/routes/signup.js +++ b/app/routes/signup.js @@ -3,15 +3,14 @@ import DS from 'ember-data'; import EmberObject from '@ember/object'; import RSVP from 'rsvp'; -import Route from '@ember/routing/route'; -import UnauthenticatedRouteMixin from 'ghost-admin/mixins/unauthenticated-route-mixin'; +import UnauthenticatedRoute from 'ghost-admin/routes/unauthenticated'; import ValidationEngine from 'ghost-admin/mixins/validation-engine'; import {inject as service} from '@ember/service'; const {Promise} = RSVP; const {Errors} = DS; -export default Route.extend(UnauthenticatedRouteMixin, { +export default UnauthenticatedRoute.extend({ ghostPaths: service(), notifications: service(), session: service(), @@ -81,11 +80,5 @@ export default Route.extend(UnauthenticatedRouteMixin, { // clear the properties that hold the sensitive data from the controller this.controllerFor('signup').get('signupDetails').setProperties({email: '', password: '', token: ''}); - }, - - buildRouteInfoMetadata() { - return { - bodyClasses: ['unauthenticated-route'] - }; } }); diff --git a/app/routes/unauthenticated.js b/app/routes/unauthenticated.js new file mode 100644 index 0000000000..105ecf2cc7 --- /dev/null +++ b/app/routes/unauthenticated.js @@ -0,0 +1,29 @@ +import Route from '@ember/routing/route'; +import {inject as service} from '@ember/service'; + +export default class UnauthenticatedRoute extends Route { + @service ajax; + @service ghostPaths; + @service session; + + beforeModel() { + let authUrl = this.ghostPaths.url.api('authentication', 'setup'); + + // check the state of the setup process via the API + return this.ajax.request(authUrl).then((result) => { + let [setup] = result.setup; + + if (setup.status !== true) { + this.transitionTo('setup'); + } else { + return this.session.prohibitAuthentication('home'); + } + }); + } + + buildRouteInfoMetadata() { + return { + bodyClasses: ['unauthenticated-route'] + }; + } +} diff --git a/app/services/session.js b/app/services/session.js index 6a26e7ccd8..bd08e42f78 100644 --- a/app/services/session.js +++ b/app/services/session.js @@ -1,9 +1,14 @@ import SessionService from 'ember-simple-auth/services/session'; import {computed} from '@ember/object'; +import {getOwner} from '@ember/application'; +import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; export default SessionService.extend({ dataStore: service('store'), // SessionService.store already exists + notifications: service(), + router: service(), + upgradeStatus: service(), user: computed(function () { return this.dataStore.queryRecord('user', {id: 'me'}); @@ -14,5 +19,53 @@ export default SessionService.extend({ this.notifyPropertyChange('user'); return this._super(...arguments); + }, + + handleAuthentication() { + if (this.skipAuthSuccessHandler) { + return; + } + + // standard ESA post-sign-in redirect + this._super('home'); + + // trigger post-sign-in background behaviour + this.user.then(() => { + this.notifications.clearAll(); + this.loadServerNotifications(); + }); + }, + + handleInvalidation() { + let transition = this.appLoadTransition; + + if (transition) { + transition.send('authorizationFailed'); + } else { + run.scheduleOnce('routerTransitions', this, 'triggerAuthorizationFailed'); + } + }, + + // TODO: this feels hacky, find a better way than using .send + triggerAuthorizationFailed() { + getOwner(this).lookup(`route:${this.router.currentRouteName}`).send('authorizationFailed'); + }, + + loadServerNotifications() { + if (this.isAuthenticated) { + this.user.then((user) => { + if (!user.isAuthorOrContributor) { + this.dataStore.findAll('notification', {reload: true}).then((serverNotifications) => { + serverNotifications.forEach((notification) => { + if (notification.top || notification.custom) { + this.notifications.handleNotification(notification); + } else { + this.upgradeStatus.handleUpgradeNotification(notification); + } + }); + }); + } + }); + } } }); From 78fbe0d4751c1ba3f185875b72bc60055e875ee1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:28:30 +0100 Subject: [PATCH 0087/3032] Update dependency ember-svg-jar to v2.3.3 (#1902) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 0d44424a1a..e4f09dc136 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "ember-simple-auth": "3.1.0", "ember-sinon": "5.0.0", "ember-source": "3.21.3", - "ember-svg-jar": "2.2.3", + "ember-svg-jar": "2.3.3", "ember-test-selectors": "5.0.0", "ember-tooltips": "3.4.7", "ember-truth-helpers": "3.0.0", diff --git a/yarn.lock b/yarn.lock index 63329cbdac..1e644b4975 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5833,7 +5833,7 @@ ember-assign-helper@^0.2.0: dependencies: ember-cli-babel "^6.6.0" -ember-assign-polyfill@^2.5.0, ember-assign-polyfill@^2.6.0: +ember-assign-polyfill@^2.6.0: version "2.7.2" resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.7.2.tgz#58f6f60235126cb23df248c846008fa9a3245fc1" integrity sha512-hDSaKIZyFS0WRQsWzxUgO6pJPFfmcpfdM7CbGoMgYGriYbvkKn+k8zTXSKpTFVGehhSmsLE9YPqisQ9QpPisfA== @@ -7122,20 +7122,21 @@ ember-style-modifier@^0.6.0: ember-cli-babel "^7.21.0" ember-modifier "^2.1.0" -ember-svg-jar@2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-2.2.3.tgz#632f8d6a999ceb1c815a135fbc2bd681b856330b" - integrity sha512-17kBxi5IfsEnCsVuFTjVs+HEAa3sfdB4t4C+5GZUxWixEbK8hwoRDsuvsboOGhDemycVv21GAyexcTeinabsnQ== +ember-svg-jar@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/ember-svg-jar/-/ember-svg-jar-2.3.3.tgz#aede3f23e58bdcacc0e59a297c1ebad71a472e31" + integrity sha512-Obs8vEMKPfS2R48bKBAfNSLphFsDwUMRqi8TVKtlLE6okTXC8NebGg7pA/IutIGnakqJRAz4/dWAZyI74duDuQ== dependencies: broccoli-caching-writer "^3.0.3" broccoli-concat "^3.7.4" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" broccoli-persistent-filter "^2.3.1" + broccoli-plugin "^3.0.0" broccoli-string-replace "^0.1.2" broccoli-svg-optimizer "2.0.0" cheerio "^0.22.0" - ember-assign-polyfill "^2.5.0" + console-ui "^3.1.1" ember-cli-babel "^7.7.3" json-stable-stringify "^1.0.1" lodash "^4.17.15" From ee6b9e5d429b1d184eba7a8997532b76b68467c6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:28:47 +0100 Subject: [PATCH 0088/3032] Update dependency ember-power-select to v4.1.4 (#1900) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 135 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 125 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index e4f09dc136..00bbc6a08f 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "ember-one-way-select": "4.0.1", "ember-power-calendar-moment": "0.1.7", "ember-power-datepicker": "0.8.1", - "ember-power-select": "4.1.0", + "ember-power-select": "4.1.4", "ember-resolver": "8.0.2", "ember-route-action-helper": "2.0.8", "ember-simple-auth": "3.1.0", diff --git a/yarn.lock b/yarn.lock index 1e644b4975..123a56b537 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1475,6 +1475,45 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" +"@embroider/core@0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.36.0.tgz#fbbd60d29c3fcbe02b4e3e63e6043a43de2b9ce3" + integrity sha512-J6esENP+aNt+/r070cF1RCJyCi/Rn1I6uFp37vxyLWwvGDuT0E7wGcaPU29VBkBFqxi4Z1n4F796BaGHv+kX6w== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.36.0" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-node-api "^1.7.0" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.1" + broccoli-source "^3.0.0" + debug "^3.1.0" + escape-string-regexp "^4.0.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.4.2" + js-string-escape "^1.0.1" + jsdom "^16.4.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^7.3.2" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" + "@embroider/core@0.37.0": version "0.37.0" resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.37.0.tgz#bd7a7d63795794ffcd53d90a65b81e939ccf6cff" @@ -1559,6 +1598,21 @@ resolve "^1.8.1" semver "^7.3.2" +"@embroider/macros@0.36.0", "@embroider/macros@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.36.0.tgz#5330f1e6f12112f0f68e34b3e4855dc7dd3c69a5" + integrity sha512-w37G4uXG+Wi3K3EHSFBSr/n6kGFXYG8nzZ9ptzDOC7LP3Oh5/MskBnVZW3+JkHXUPEqKsDGlxPxCVpPl1kQyjQ== + dependencies: + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.36.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" + semver "^7.3.2" + "@embroider/macros@0.37.0", "@embroider/macros@^0.37.0": version "0.37.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.37.0.tgz#221013fc5bc0eaa78f1de98802fc03e588bfe1b1" @@ -1574,6 +1628,14 @@ resolve "^1.8.1" semver "^7.3.2" +"@embroider/util@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@embroider/util/-/util-0.36.0.tgz#b2ffb2b06ac491f157a771392191ce91ef2216a6" + integrity sha512-gMIGL9UQ6Pl5WvpcIqIiE+QkK5GW49VLp+IEl+v4w9ZBkH7Z9boiwWariW4y/FtNU1iU8ELFbol1+IJ8I8VN4Q== + dependencies: + "@embroider/macros" "0.36.0" + ember-cli-babel "^7.22.1" + "@eslint/eslintrc@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" @@ -1589,7 +1651,7 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@glimmer/component@1.0.4": +"@glimmer/component@1.0.4", "@glimmer/component@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@glimmer/component/-/component-1.0.4.tgz#1c85a5181615a6647f6acfaaed68e28ad7e9626e" integrity sha512-sS4N8wtcKfYdUJ6O3m8nbTut6NjErdz94Ap8VB1ekcg4WSD+7sI7Nmv6kt2rdPoe363nUdjUbRBzHNWhLzraBw== @@ -1704,6 +1766,14 @@ "@glimmer/env" "^0.1.7" "@glimmer/validator" "^0.44.0" +"@glimmer/tracking@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@glimmer/tracking/-/tracking-1.0.4.tgz#f1bc1412fe5e2236d0f8d502994a8f88af1bbb21" + integrity sha512-F+oT8I55ba2puSGIzInmVrv/8QA2PcK1VD+GWgFMhF6WC97D+uZX7BFg+a3s/2N4FVBq5KHE+QxZzgazM151Yw== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/validator" "^0.44.0" + "@glimmer/util@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.42.2.tgz#9ca1631e42766ea6059f4b49d0bdfb6095aad2c4" @@ -5910,7 +5980,7 @@ ember-auto-import@^1.2.19, ember-auto-import@^1.5.2, ember-auto-import@^1.5.3, e walk-sync "^0.3.3" webpack "^4.43.0" -ember-basic-dropdown@^3.0.1, ember-basic-dropdown@^3.0.11: +ember-basic-dropdown@^3.0.1: version "3.0.12" resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-3.0.12.tgz#dc9eb1098cec6e1af27402c62cc3c3402e6d5824" integrity sha512-W67UtAWaANCEwwHYTiagfLRlAcn6dC6f0NO0DpJRIZK9iflBzV6nSIkbCuN1lwf6JFRbEGoFj2bV+io0maMCsg== @@ -5926,6 +5996,24 @@ ember-basic-dropdown@^3.0.1, ember-basic-dropdown@^3.0.11: ember-style-modifier "^0.6.0" ember-truth-helpers "^2.1.0 || ^3.0.0" +ember-basic-dropdown@^3.0.16: + version "3.0.16" + resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-3.0.16.tgz#287fcde57b5a37405d89cc65e0a4ad9a2e8e1b0b" + integrity sha512-ctVQL63nWoZ6+Lvb6aCo70SUA8ieMz5fQa0BuQKeV2LQx8njXDiZZ96gaK0PBn60glNghbIr1ZKU+wmnIT++5w== + dependencies: + "@ember/render-modifiers" "^1.0.2" + "@embroider/macros" "^0.36.0" + "@embroider/util" "^0.36.0" + "@glimmer/component" "^1.0.4" + "@glimmer/tracking" "^1.0.4" + ember-cli-babel "^7.23.1" + ember-cli-htmlbars "^5.3.2" + ember-cli-typescript "^4.1.0" + ember-element-helper "^0.3.2" + ember-maybe-in-element "^2.0.1" + ember-style-modifier "^0.6.0" + ember-truth-helpers "^2.1.0 || ^3.0.0" + ember-classic-decorator@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-classic-decorator/-/ember-classic-decorator-2.0.0.tgz#e781e0811a92524ad177b490f404f513794aee39" @@ -6161,7 +6249,7 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" -ember-cli-htmlbars@5.7.1: +ember-cli-htmlbars@5.7.1, ember-cli-htmlbars@^5.1.0, ember-cli-htmlbars@^5.3.2: version "5.7.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== @@ -6453,6 +6541,22 @@ ember-cli-typescript@^3.1.2, ember-cli-typescript@^3.1.3, ember-cli-typescript@^ stagehand "^1.0.0" walk-sync "^2.0.0" +ember-cli-typescript@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-4.1.0.tgz#2ff17be2e6d26b58c88b1764cb73887e7176618b" + integrity sha512-zSuKG8IQuYE3vS+c7V0mHJqwrN/4Wo9Wr50+0NUjnZH3P99ChynczQHu/P7WSifkO6pF6jaxwzf09XzWvG8sVw== + dependencies: + ansi-to-html "^0.6.6" + broccoli-stew "^3.0.0" + debug "^4.0.0" + execa "^4.0.0" + fs-extra "^9.0.1" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^7.3.2" + stagehand "^1.0.0" + walk-sync "^2.2.0" + ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" @@ -6696,6 +6800,15 @@ ember-element-helper@^0.2.0: dependencies: ember-cli-babel "^6.16.0" +ember-element-helper@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ember-element-helper/-/ember-element-helper-0.3.2.tgz#a0e384c266c6fb0e39803708d6f5e83ce6dba659" + integrity sha512-t4lrekoRb/jVQeg/N1V0kzehV6cw0YAH1hG1H2+Ykl35YxpYdX7/8hKtaGzVPxceemUVFO7fUorEQ6Y//wpWdA== + dependencies: + ember-cli-babel "^7.17.2" + ember-cli-htmlbars "^5.1.0" + ember-compatibility-helpers "^1.2.1" + ember-ella-sparse@0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/ember-ella-sparse/-/ember-ella-sparse-0.16.0.tgz#4bef20c23bfa9deb5829358e99293450ffbfd7fc" @@ -6990,18 +7103,18 @@ ember-power-datepicker@0.8.1: ember-decorators "^6.1.1" ember-power-calendar "^0.15.0" -ember-power-select@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-4.1.0.tgz#0897ae56ed96835b2393452b3303126407d468b7" - integrity sha512-HJQDQq8riUUtrfrN69yRIOCx8hsLPGmA6/pAn8BOnmL+N+86It8d/xRpXrZBQw/Dw9cnj9EQp2Vqi0PhPBBhGg== +ember-power-select@4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-4.1.4.tgz#bf293f9190b115c6367d01ac6ae8a2ab19cb1385" + integrity sha512-YZmjtX8ASLaO4Udl8y1A7xKEj7oB+/kmKPlwWyu6935Y1QoAcYeOrZQg+1kFNnWfhLyqAD6zUukmfTPYb2AGhg== dependencies: "@glimmer/component" "^1.0.2" "@glimmer/tracking" "^1.0.2" ember-assign-helper "^0.3.0" - ember-basic-dropdown "^3.0.11" - ember-cli-babel "^7.22.1" + ember-basic-dropdown "^3.0.16" + ember-cli-babel "^7.23.0" ember-cli-htmlbars "^5.3.1" - ember-cli-typescript "^3.1.4" + ember-cli-typescript "^4.1.0" ember-concurrency ">=1.0.0 <3" ember-concurrency-decorators "^2.0.0" ember-text-measurer "^0.6.0" @@ -7819,7 +7932,7 @@ execa@^3.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.3: +execa@^4.0.0, execa@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== From d5d5f0b40c781c237e2ce7327b89b790d025d5dc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:29:04 +0100 Subject: [PATCH 0089/3032] Update dependency @tryghost/members-csv to v1 (#1907) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 00bbc6a08f..73634ba80f 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@tryghost/kg-clean-basic-html": "1.0.16", "@tryghost/kg-parser-plugins": "1.1.6", "@tryghost/limit-service": "0.4.1", - "@tryghost/members-csv": "0.4.5", + "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.17", "@tryghost/timezone-data": "0.2.39", diff --git a/yarn.lock b/yarn.lock index 123a56b537..e51bb871d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1910,10 +1910,10 @@ dependencies: lodash "^4.17.21" -"@tryghost/members-csv@0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@tryghost/members-csv/-/members-csv-0.4.5.tgz#a389221b64ddaebc1bc33ddaa92e40ca20018893" - integrity sha512-Q2FKbMphYYN3dIM8nGWGYrI6cyCqV2vpR6ECvZOq77ZW4jrZEIkftk2YfuoCufPfkWTjFc7Ct6dodDRGn2vcXg== +"@tryghost/members-csv@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tryghost/members-csv/-/members-csv-1.0.0.tgz#fc062ed56d29f4b60803970bba0f6cef5eb7e244" + integrity sha512-/kUn9inC3nDNK9sBZ+eaWsJgX5+M28NGkw6QHLOBtbv7zgomjSjjNVSJUJEuw02/ZOKqyVwSU3E+i9m6M270zQ== dependencies: papaparse "5.3.0" From d987e9ffb1b86326bcb14dd18dd16d97e4c03a6f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:30:00 +0100 Subject: [PATCH 0090/3032] Update dependency ember-cli-app-version to v5 (#1908) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 73634ba80f..a2d9a31dbd 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "ember-auto-import": "1.11.2", "ember-classic-decorator": "2.0.0", "ember-cli": "3.21.2", - "ember-cli-app-version": "4.0.0", + "ember-cli-app-version": "5.0.0", "ember-cli-babel": "7.26.3", "ember-cli-chart": "3.7.2", "ember-cli-dependency-checker": "3.2.0", diff --git a/yarn.lock b/yarn.lock index e51bb871d3..c91c56393f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6023,12 +6023,12 @@ ember-classic-decorator@2.0.0: babel-plugin-filter-imports "^3.0.0" ember-cli-babel "^7.11.1" -ember-cli-app-version@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-4.0.0.tgz#033057ec5fe4d3ecdf5ac5380d442e2dc9f7526a" - integrity sha512-YRH1r4vjA9ZIgTVJ38zWxhtt4SCzIHb0ppEsO/z+JV0ZTQlS3+2dT5RhJWz7O3dyw5FWnlIng+gPRoQEz1umHA== +ember-cli-app-version@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-5.0.0.tgz#adad17c6f706f419b223707eec66dd1cd28530c3" + integrity sha512-afhx/CXDOMNXzoe4NDPy5WUfxWmYYHUzMCiTyvPBxCDBXYcMrtxNWxvgaSaeqcoHVEmqzeyBj8V82tzmT1dcyw== dependencies: - ember-cli-babel "^7.22.1" + ember-cli-babel "^7.23.1" git-repo-info "^2.1.1" ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, ember-cli-babel-plugin-helpers@^1.1.1: From acb3923b5a0b41983f9d1e9a8997058bb96dc9aa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:30:16 +0100 Subject: [PATCH 0091/3032] Update dependency faker to v5.5.3 (#1903) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a2d9a31dbd..da0f6e060b 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "emberx-file-input": "1.2.1", "eslint": "7.24.0", "eslint-plugin-ghost": "2.0.0", - "faker": "5.1.0", + "faker": "5.5.3", "fs-extra": "9.0.1", "glob": "7.1.6", "google-caja-bower": "https://github.com/acburdine/google-caja-bower#ghost", diff --git a/yarn.lock b/yarn.lock index c91c56393f..68baf20f79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8071,10 +8071,10 @@ fake-xml-http-request@^2.1.1: resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz#279fdac235840d7a4dff77d98ec44bce9fc690a6" integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== -faker@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-5.1.0.tgz#e10fa1dec4502551aee0eb771617a7e7b94692e8" - integrity sha512-RrWKFSSA/aNLP0g3o2WW1Zez7/MnMr7xkiZmoCfAGZmdkDQZ6l2KtuXHN5XjdvpRjDl8+3vf+Rrtl06Z352+Mw== +faker@5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e" + integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== fast-deep-equal@^2.0.1: version "2.0.1" From ad3671f9197654351c5e77ec4fc1cdd119bcb767 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:33:07 +0100 Subject: [PATCH 0092/3032] Update dependency @html-next/vertical-collection to v2 (#1906) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index da0f6e060b..e9c0266482 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@ember/optional-features": "2.0.0", "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", - "@html-next/vertical-collection": "1.0.0", + "@html-next/vertical-collection": "2.0.0", "@tryghost/helpers": "1.1.41", "@tryghost/kg-clean-basic-html": "1.0.16", "@tryghost/kg-parser-plugins": "1.1.6", diff --git a/yarn.lock b/yarn.lock index 68baf20f79..2fab940a18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1805,20 +1805,20 @@ "@glimmer/interfaces" "^0.42.2" "@glimmer/util" "^0.42.2" -"@html-next/vertical-collection@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@html-next/vertical-collection/-/vertical-collection-1.0.0.tgz#2845bce90a72bb212ec307b184c98e4d78d023fc" - integrity sha512-qmSbIXiiQVNBkSJZK2or8TVhMn7aiUFHlbkHcKa1Cbn6BDQnqKkdoMaB+Ii1s0Dc8XmpMS1t/enCmAfszZ9+cw== +"@html-next/vertical-collection@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@html-next/vertical-collection/-/vertical-collection-2.0.0.tgz#469f30966cf665afcc24a80b59cd0725134b7f79" + integrity sha512-+RMxBz8tSSFDDA8Q8NBC5Eak50PVHsB73GL7bkPyAuNtdm324nMVrzqJ6TYVg5mTFbc02W261/9jhfbawQbczA== dependencies: babel6-plugin-strip-class-callcheck "^6.0.0" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.1" broccoli-rollup "^4.1.1" - ember-cli-babel "^7.7.3" - ember-cli-htmlbars "^3.0.0" + ember-cli-babel "^7.12.0" + ember-cli-htmlbars "^3.0.1" ember-cli-version-checker "^3.1.3" - ember-compatibility-helpers "^1.2.0" - ember-raf-scheduler "0.1.0" + ember-compatibility-helpers "^1.2.1" + ember-raf-scheduler "0.2.0" "@miragejs/pretender-node-polyfill@^0.1.0": version "0.1.2" @@ -6036,7 +6036,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.26.3: +ember-cli-babel@7.26.3, ember-cli-babel@^7.12.0: version "7.26.3" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.3.tgz#e93ce7ec458208894d10844cf76e41cc06fdbeb6" integrity sha512-ZCs0g99d3kYaHs1+HT33oMY7/K+nLCAAv7dCLxsMzg7cQf55O6Pq4ZKnWEr3IHVs33xbJFnEb9prt1up36QVnw== @@ -7120,12 +7120,12 @@ ember-power-select@4.1.4: ember-text-measurer "^0.6.0" ember-truth-helpers "^2.1.0 || ^3.0.0" -ember-raf-scheduler@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ember-raf-scheduler/-/ember-raf-scheduler-0.1.0.tgz#a22a02d238c374499231c03ab9c5b9887c72a853" - integrity sha1-oioC0jjDdEmSMcA6ucW5iHxyqFM= +ember-raf-scheduler@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ember-raf-scheduler/-/ember-raf-scheduler-0.2.0.tgz#73250f6ca9760e4920c26d2eeb69738dc66dadc5" + integrity sha512-z34reOLFORfigukrba3d5I333rixfcPjjfKPOKeaPAHf3I5wXfenoAze0Ijc7r4l/lO/4ocLw9RJbtNL2/oNpw== dependencies: - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.12.0" ember-resolver@8.0.2: version "8.0.2" From 9643082efbb6ef652ad7cb592f997d95559a0e22 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:42:50 +0100 Subject: [PATCH 0093/3032] Update dependency fs-extra to v9.1.0 (#1904) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e9c0266482..ebec964d51 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "eslint": "7.24.0", "eslint-plugin-ghost": "2.0.0", "faker": "5.5.3", - "fs-extra": "9.0.1", + "fs-extra": "9.1.0", "glob": "7.1.6", "google-caja-bower": "https://github.com/acburdine/google-caja-bower#ghost", "grunt": "1.3.0", diff --git a/yarn.lock b/yarn.lock index 2fab940a18..5fe84cbdd1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8508,15 +8508,15 @@ from2@^2.1.0, from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@9.0.1, fs-extra@^9.0.0, fs-extra@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== +fs-extra@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^1.0.0" + universalify "^2.0.0" fs-extra@^0.24.0: version "0.24.0" @@ -8573,6 +8573,16 @@ fs-extra@^8.0.0, fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-merger@^3.0.1, fs-merger@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.1.0.tgz#f30f74f6c70b2ff7333ec074f3d2f22298152f3b" From 9eefe5bad2d81f1daeaef3aa72323d832c5dca3a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:42:58 +0100 Subject: [PATCH 0094/3032] Update dependency ember-concurrency to v2 (#1909) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ebec964d51..b36dfe1bb5 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "ember-cli-terser": "4.0.1", "ember-cli-test-loader": "3.0.0", "ember-composable-helpers": "4.4.1", - "ember-concurrency": "1.3.0", + "ember-concurrency": "2.0.3", "ember-concurrency-decorators": "2.0.3", "ember-data": "3.21.2", "ember-decorators": "6.1.1", diff --git a/yarn.lock b/yarn.lock index 5fe84cbdd1..b4b91b2a28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6249,7 +6249,7 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" -ember-cli-htmlbars@5.7.1, ember-cli-htmlbars@^5.1.0, ember-cli-htmlbars@^5.3.2: +ember-cli-htmlbars@5.7.1, ember-cli-htmlbars@^5.1.0, ember-cli-htmlbars@^5.3.2, ember-cli-htmlbars@^5.6.3: version "5.7.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== @@ -6726,7 +6726,18 @@ ember-concurrency-decorators@2.0.3, ember-concurrency-decorators@^2.0.0: ember-cli-htmlbars "^4.3.1" ember-cli-typescript "^3.1.4" -ember-concurrency@1.3.0, "ember-concurrency@>=1.0.0 <3", "ember-concurrency@^0.8.27 || ^0.9.0 || ^0.10.0 || ^1.0.0 || ^1.1.0", ember-concurrency@^1.0.0: +ember-concurrency@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-2.0.3.tgz#d8ac917fdf013a277bfc7b26e417937ee0638455" + integrity sha512-+fOOFt32odnunDL3Du0LqMgnRzDDNKnzo1ry9ppICpvLXekJzYFwU1RniVivfJ+9nbpHMJZQUlZJAm1ZAnTExw== + dependencies: + "@glimmer/tracking" "^1.0.2" + ember-cli-babel "^7.22.1" + ember-cli-htmlbars "^5.6.3" + ember-compatibility-helpers "^1.2.0" + ember-destroyable-polyfill "^2.0.2" + +"ember-concurrency@>=1.0.0 <3", "ember-concurrency@^0.8.27 || ^0.9.0 || ^0.10.0 || ^1.0.0 || ^1.1.0", ember-concurrency@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.3.0.tgz#66f90fb792687470bcee1172adc0ebf33f5e8b9c" integrity sha512-DwGlfWFpYyAkTwsedlEtK4t1DznJSculAW6Vq5S1C0shVPc5b6tTpHB2FFYisannSYkm+wpm1f1Pd40qiNPtOQ== From 12ab6e1cbfde7125fa3c4b5afd6609834c147894 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:51:07 +0100 Subject: [PATCH 0095/3032] Update dependency ember-in-viewport to v3.9.0 (#1899) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b36dfe1bb5..1fad8b1348 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "ember-exam": "6.0.1", "ember-export-application-global": "2.0.1", "ember-fetch": "8.0.4", - "ember-in-viewport": "3.8.1", + "ember-in-viewport": "3.9.0", "ember-infinity": "2.1.2", "ember-keyboard": "6.0.2", "ember-load": "0.0.17", diff --git a/yarn.lock b/yarn.lock index b4b91b2a28..2ed6e50567 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6913,10 +6913,10 @@ ember-in-element-polyfill@^1.0.1: ember-cli-htmlbars "^5.3.1" ember-cli-version-checker "^5.1.2" -ember-in-viewport@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/ember-in-viewport/-/ember-in-viewport-3.8.1.tgz#fd8305366d425c3912def49210e63fd582a7e60d" - integrity sha512-abzKIa7FiOBz3fLkZ3ZSgxJQf5enGe1IdrLdjfo5HjdyWTq9j+B0lzuZCoOYUuWdoiTiXvT3gDFNqQ5j7ky2kw== +ember-in-viewport@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ember-in-viewport/-/ember-in-viewport-3.9.0.tgz#2d1eea2e7ea058f8816f1e7a9b5bcc86e632f6fe" + integrity sha512-OhHKqJKseF1S3NefCRe0jeaGEVOmXqinrlYpi7jfjhsjwHCt8MUAhBZiWycwOmbYwVBPRwpFlDrLNmN1uJxAYA== dependencies: ember-auto-import "^1.6.0" ember-cli-babel "^7.22.1" From 8855c98ed8bdf470d564b8f9a61a9cc4dd229bf1 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 12 Apr 2021 15:32:39 +0100 Subject: [PATCH 0096/3032] Fixed faker.random.number rename warnings no issue - `faker.random.number` is now `faker.datatype.number` --- mirage/config/members.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mirage/config/members.js b/mirage/config/members.js index abbdb10055..03997b7bd3 100644 --- a/mirage/config/members.js +++ b/mirage/config/members.js @@ -8,7 +8,7 @@ export function mockMembersStats(server) { server.get('/members/stats/count', function (db, {queryParams}) { let {days} = queryParams; - let firstSubscriberDays = faker.random.number({min: 30, max: 600}); + let firstSubscriberDays = faker.datatype.number({min: 30, max: 600}); if (days === 'all-time') { days = firstSubscriberDays; @@ -18,7 +18,7 @@ export function mockMembersStats(server) { let total = 0; if (firstSubscriberDays > days) { - total += faker.random.number({max: 1000}); + total += faker.datatype.number({max: 1000}); } // simulate sql GROUP BY where days with 0 subscribers are missing @@ -26,7 +26,7 @@ export function mockMembersStats(server) { let i = 0; while (i < days) { let date = moment().subtract(i, 'days').format('YYYY-MM-DD'); - let count = faker.random.number({min: 0, max: 30}); + let count = faker.datatype.number({min: 0, max: 30}); if (count !== 0) { dateCounts[date] = count; From cb58a98350071e09e0b1985712eb1ed5b30fc7ee Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Tue, 13 Apr 2021 16:23:48 +0100 Subject: [PATCH 0097/3032] v4.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d355146cc0..9c14251a21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.2.0", + "version": "4.2.1", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 1146925947367e31fd8bfccd8f20c4a1d3ddf7bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Apr 2021 18:36:57 +0100 Subject: [PATCH 0098/3032] Update dependency @tryghost/kg-clean-basic-html to v1.0.17 (#1911) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 31a9370e31..54aa5a5c9c 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "2.0.0", "@tryghost/helpers": "1.1.41", - "@tryghost/kg-clean-basic-html": "1.0.16", + "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.6", "@tryghost/limit-service": "0.4.1", "@tryghost/members-csv": "1.0.0", diff --git a/yarn.lock b/yarn.lock index 2ed6e50567..3f8a4130ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1891,7 +1891,12 @@ dependencies: lodash-es "^4.17.11" -"@tryghost/kg-clean-basic-html@1.0.16", "@tryghost/kg-clean-basic-html@^1.0.16": +"@tryghost/kg-clean-basic-html@1.0.17": + version "1.0.17" + resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.17.tgz#5b60ca9d020fc9cb02e938caec0ec1da969a73de" + integrity sha512-lvqXs51YdokNQg1bwuk/a3C+0h6Ve6Fw23hUJvBKl6ViaKae6KcLHX3qyVr7uN/QpKMWrhsAD0pdoo+2xA0FWQ== + +"@tryghost/kg-clean-basic-html@^1.0.16": version "1.0.16" resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.16.tgz#223450ae1726a9bf91b1918281d3e6b89df434a6" integrity sha512-4LJL1ue9BgmPPOO1/4xhp6E0ta2nE85V0vkxeNRxpun/zOC3EQP7hf2U6rYoZ6yz1fa+h7Yjvv9309q+zgzRCA== From 3430c24fede58841ec6e9bb4e9b6c6f1ad681917 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Apr 2021 18:37:17 +0100 Subject: [PATCH 0099/3032] Update dependency broccoli-funnel to v3.0.4 (#1913) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 54aa5a5c9c..b444396d2d 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "blueimp-md5": "2.18.0", "broccoli-asset-rev": "3.0.0", "broccoli-concat": "4.2.4", - "broccoli-funnel": "3.0.3", + "broccoli-funnel": "3.0.4", "broccoli-merge-trees": "4.2.0", "broccoli-terser-sourcemap": "4.1.0", "chai": "4.3.4", diff --git a/yarn.lock b/yarn.lock index 3f8a4130ca..844bb0e88a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3837,10 +3837,10 @@ broccoli-funnel@2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@3.0.3, broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.3.tgz#26fd42632471f67a91f4770d1987118087219937" - integrity sha512-LPzZ91BwStoHZXdXHQAJeYORl189OrRKM5NdIi86SDU9wZ4s/3lV1PRFOiobDT/jKM10voM7CDzfvicHbCYxAQ== +broccoli-funnel@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.4.tgz#0fe6b7e8745fa4585f30470fbfe54653ce058e3c" + integrity sha512-6w0nhWvBeTnOQ0DGVM9mCvFN32duLbXxyE06qLFi9jcd0HwfODkQ0QMtvvuM60+i7pHa+JQ75MStWHpj1DIaoA== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -3892,6 +3892,22 @@ broccoli-funnel@^1.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" +broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.3.tgz#26fd42632471f67a91f4770d1987118087219937" + integrity sha512-LPzZ91BwStoHZXdXHQAJeYORl189OrRKM5NdIi86SDU9wZ4s/3lV1PRFOiobDT/jKM10voM7CDzfvicHbCYxAQ== + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^4.0.1" + debug "^4.1.1" + fast-ordered-set "^1.0.0" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + path-posix "^1.0.0" + walk-sync "^2.0.2" + broccoli-kitchen-sink-helpers@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" From d7db18bec4259612f14c9b311991d1c4eb074cda Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Apr 2021 18:39:14 +0100 Subject: [PATCH 0100/3032] Update dependency @tryghost/kg-parser-plugins to v1.1.7 (#1912) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index b444396d2d..2dd2d01468 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@html-next/vertical-collection": "2.0.0", "@tryghost/helpers": "1.1.41", "@tryghost/kg-clean-basic-html": "1.0.17", - "@tryghost/kg-parser-plugins": "1.1.6", + "@tryghost/kg-parser-plugins": "1.1.7", "@tryghost/limit-service": "0.4.1", "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", diff --git a/yarn.lock b/yarn.lock index 844bb0e88a..6dd3491e31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1891,22 +1891,17 @@ dependencies: lodash-es "^4.17.11" -"@tryghost/kg-clean-basic-html@1.0.17": +"@tryghost/kg-clean-basic-html@1.0.17", "@tryghost/kg-clean-basic-html@^1.0.17": version "1.0.17" resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.17.tgz#5b60ca9d020fc9cb02e938caec0ec1da969a73de" integrity sha512-lvqXs51YdokNQg1bwuk/a3C+0h6Ve6Fw23hUJvBKl6ViaKae6KcLHX3qyVr7uN/QpKMWrhsAD0pdoo+2xA0FWQ== -"@tryghost/kg-clean-basic-html@^1.0.16": - version "1.0.16" - resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.16.tgz#223450ae1726a9bf91b1918281d3e6b89df434a6" - integrity sha512-4LJL1ue9BgmPPOO1/4xhp6E0ta2nE85V0vkxeNRxpun/zOC3EQP7hf2U6rYoZ6yz1fa+h7Yjvv9309q+zgzRCA== - -"@tryghost/kg-parser-plugins@1.1.6": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@tryghost/kg-parser-plugins/-/kg-parser-plugins-1.1.6.tgz#8c13acd65977e8e2c0c6a686a96ba32994e8faaf" - integrity sha512-IfwezZpqt96V1E/XujZnUTu/MQiUd0nBWELGmQJYChGAbbyi5B4Ef2qzaEXW3Ox+IBR6poOF63xFh+4sBWs1Aw== +"@tryghost/kg-parser-plugins@1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@tryghost/kg-parser-plugins/-/kg-parser-plugins-1.1.7.tgz#b6fd853a9b9cf6dd094466cd685d03b5779a278b" + integrity sha512-ahDsM8V+IvU/7GEZEEsLntItdXLd0qHkn/TfdhKxE/oHbrON3VvJ/ue9WUUFGtysSx6m/rdWzYeGZ+K2nOsJnw== dependencies: - "@tryghost/kg-clean-basic-html" "^1.0.16" + "@tryghost/kg-clean-basic-html" "^1.0.17" "@tryghost/limit-service@0.4.1": version "0.4.1" From cca2b071804e8733499888cfbdbe4360314e7cba Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Apr 2021 18:45:44 +0100 Subject: [PATCH 0101/3032] Update dependency broccoli-concat to v4.2.5 (#1914) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2dd2d01468..f1fa711b57 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "babel-eslint": "10.1.0", "blueimp-md5": "2.18.0", "broccoli-asset-rev": "3.0.0", - "broccoli-concat": "4.2.4", + "broccoli-concat": "4.2.5", "broccoli-funnel": "3.0.4", "broccoli-merge-trees": "4.2.0", "broccoli-terser-sourcemap": "4.1.0", diff --git a/yarn.lock b/yarn.lock index 6dd3491e31..80764ced5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3713,10 +3713,10 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@4.2.4, broccoli-concat@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-4.2.4.tgz#78e359ddc540b999d815355163bf3cfb6bd67322" - integrity sha512-NgdBIE57r+U/AslBohQr0mCS7PopIWL8dihMI1CzqffQkisAgqWMuddjYmizqRBQlml7crBFaBeUnPDHhf4/RQ== +broccoli-concat@4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-4.2.5.tgz#d578f00094048b5fc87195e82fbdbde20d838d29" + integrity sha512-dFB5ATPwOyV8S2I7a07HxCoutoq23oY//LhM6Mou86cWUTB174rND5aQLR7Fu8FjFFLxoTbkk7y0VPITJ1IQrw== dependencies: broccoli-debug "^0.6.5" broccoli-kitchen-sink-helpers "^0.3.1" @@ -3748,6 +3748,23 @@ broccoli-concat@^3.2.2, broccoli-concat@^3.7.4: lodash.uniq "^4.2.0" walk-sync "^0.3.2" +broccoli-concat@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-4.2.4.tgz#78e359ddc540b999d815355163bf3cfb6bd67322" + integrity sha512-NgdBIE57r+U/AslBohQr0mCS7PopIWL8dihMI1CzqffQkisAgqWMuddjYmizqRBQlml7crBFaBeUnPDHhf4/RQ== + dependencies: + broccoli-debug "^0.6.5" + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^4.0.2" + ensure-posix-path "^1.0.2" + fast-sourcemap-concat "^2.1.0" + find-index "^1.1.0" + fs-extra "^8.1.0" + fs-tree-diff "^2.0.1" + lodash.merge "^4.6.2" + lodash.omit "^4.1.0" + lodash.uniq "^4.2.0" + broccoli-config-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" From 12ddce7748ca02c84cb6dadd3ff90157040aac49 Mon Sep 17 00:00:00 2001 From: Sanne de Vries <65487235+sanne-san@users.noreply.github.com> Date: Wed, 14 Apr 2021 20:02:36 +0200 Subject: [PATCH 0102/3032] Moved default post access from Payments to Access screen (#1879) refs https://github.com/TryGhost/Team/issues/579 - updated access section on Payments screen to only show when not running developer experiments - added default post access settings to Access screen Co-authored-by: Kevin Ansfield --- .../gh-members-payments-setting.hbs | 2 + app/controllers/settings/members-access.js | 11 ++++ app/templates/settings/members-access.hbs | 51 ++++++++++++++++++- 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/app/components/gh-members-payments-setting.hbs b/app/components/gh-members-payments-setting.hbs index 7becaf5a56..889b01c234 100644 --- a/app/components/gh-members-payments-setting.hbs +++ b/app/components/gh-members-payments-setting.hbs @@ -216,6 +216,7 @@
    +{{#unless (enable-developer-experiments)}}

    Access

    @@ -277,6 +278,7 @@
    +{{/unless}} {{#if this.showDisconnectStripeConnectModal}}
    -
    +
    +
    +
    +
    +

    Default post access

    +

    When a new post is created, who should have access to it?

    +
    + +
    +
    + {{#liquid-if this.membersPostAccessOpen}} +
    +
    +
    +
    +
    Public
    + All site visitors to your site, no login required
    +
    +
    +
    +
    +
    +
    Members only
    + All logged-in members
    +
    +
    + +
    +
    +
    +
    Paid-members only
    + Only logged-in members with an active Stripe subscription
    +
    +
    +
    + {{/liquid-if}} +
    +
    +
    {{#if this.showLeaveSettingsModal}} From b0137813bfbc7d2c9310d1bb66eddf1ba55c1cd0 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 14 Apr 2021 23:43:10 +0100 Subject: [PATCH 0103/3032] Added subscription access settings to Access screen refs https://github.com/TryGhost/Team/issues/579 - moved "Allow free member signup" toggle from Payments screen to Settings screen and switched to a radio selection that allows for better description and further selection of options --- app/controllers/settings/members-access.js | 25 ++++++++++-- app/templates/settings/members-access.hbs | 47 ++++++++++++++++++++-- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/app/controllers/settings/members-access.js b/app/controllers/settings/members-access.js index dafa9fbf2b..c6a9ba155d 100644 --- a/app/controllers/settings/members-access.js +++ b/app/controllers/settings/members-access.js @@ -8,7 +8,8 @@ export default class MembersAccessController extends Controller { @service settings; @tracked showLeaveSettingsModal = false; - @tracked membersPostAccessOpen = false; + @tracked subscriptionAccessOpen = false; + @tracked postAccessOpen = false; leaveRoute(transition) { if (this.settings.get('hasDirtyAttributes')) { @@ -32,8 +33,13 @@ export default class MembersAccessController extends Controller { } @action - toggleMembersPostAccess() { - this.membersPostAccessOpen = !this.membersPostAccessOpen; + toggleSubscriptionAccess() { + this.subscriptionAccessOpen = !this.subscriptionAccessOpen; + } + + @action + togglePostAccess() { + this.postAccessOpen = !this.postAccessOpen; } @action @@ -41,6 +47,19 @@ export default class MembersAccessController extends Controller { this.settings.set('defaultContentVisibility', value); } + @action + setSubscriptionAccess(value) { + switch (value) { + case 'anyone': + this.settings.set('membersAllowFreeSignup', true); + break; + + case 'invite': + this.settings.set('membersAllowFreeSignup', false); + break; + } + } + @task({drop: true}) *saveSettingsTask() { return yield this.settings.save(); diff --git a/app/templates/settings/members-access.hbs b/app/templates/settings/members-access.hbs index 74c733e764..91812b27e5 100644 --- a/app/templates/settings/members-access.hbs +++ b/app/templates/settings/members-access.hbs @@ -21,15 +21,54 @@
    +
    +

    Subscription access

    +

    Who should be able to subscribe to your site?

    +
    + +
    +
    + {{#liquid-if this.subscriptionAccessOpen}} +
    +
    +
    +
    +
    Anyone can sign up
    + All visitors will be able to subscribe and sign in +
    +
    + +
    +
    +
    +
    Only people I invite
    + People can sign in from your site but won't be able to sign up +
    +
    +
    + {{/liquid-if}} +
    +
    +
    + +
    +
    +

    Default post access

    When a new post is created, who should have access to it?

    - -

    + +
    - {{#liquid-if this.membersPostAccessOpen}} -
    + {{#liquid-if this.postAccessOpen}} +
    Date: Thu, 15 Apr 2021 09:28:10 +0100 Subject: [PATCH 0104/3032] Update dependency markdown-it to v12.0.5 (#1915) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f1fa711b57..ce34e218cb 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "liquid-fire": "0.31.0", "liquid-wormhole": "2.1.5", "loader.js": "4.7.0", - "markdown-it": "12.0.4", + "markdown-it": "12.0.5", "markdown-it-footnote": "3.0.2", "markdown-it-lazy-headers": "0.1.3", "markdown-it-mark": "3.0.1", diff --git a/yarn.lock b/yarn.lock index 80764ced5e..b2da60be7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10878,10 +10878,10 @@ markdown-it-terminal@0.2.1: lodash.merge "^4.6.2" markdown-it "^8.3.1" -markdown-it@12.0.4: - version "12.0.4" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.4.tgz#eec8247d296327eac3ba9746bdeec9cfcc751e33" - integrity sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q== +markdown-it@12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.5.tgz#982907947dc1f72f9d651c5286678fd95af13f2e" + integrity sha512-9KB992Yy2TedaoKETgZPL2n3bmqqZxzUsZ4fxe2ho+/AYuQUz+iDKpfjLgKbg/lHcG6cGOj+L3gDrn9S2CxoRg== dependencies: argparse "^2.0.1" entities "~2.1.0" From 779650e511c049312384fec924e66332d4f1ba30 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 15 Apr 2021 11:07:18 +0200 Subject: [PATCH 0105/3032] Updated product details mock screen Updated product details mock screen for the first version: - removed icon and chart - added status to price list - changed icons to text links on price list --- app/components/modal-product-price.hbs | 4 +- app/styles/layouts/products.css | 27 ++++++++- app/templates/settings/product.hbs | 83 +++++++++++--------------- 3 files changed, 63 insertions(+), 51 deletions(-) diff --git a/app/components/modal-product-price.hbs b/app/components/modal-product-price.hbs index a724deec17..51865b4c61 100644 --- a/app/components/modal-product-price.hbs +++ b/app/components/modal-product-price.hbs @@ -51,7 +51,7 @@

    Advanced

    - + {{!--
    days
    -
    +
    --}}

    Product details

    - + {{!--
    Icon
    -
    +
    --}}
    @@ -58,7 +58,7 @@
    -
    + {{!--

    Members

    CHART
    @@ -68,7 +68,7 @@
    See members → -
    +
    --}} @@ -82,91 +82,78 @@
  • - +

    Monthly

    Full access

    - +
    - +
    $5 USD / month - +
    - +
    91 - +
    - +
    - - {{svg-jar "pen" class="w6 h6 fill-midgrey pa1 mr1"}} - - + Edit +
    - +
  • - +

    Yearly

    37% discount

    - +
    - +
    $50 USD / year - +
    - +
    76 - +
    - +
    - - {{svg-jar "pen" class="w6 h6 fill-midgrey pa1 mr1"}} - - + Edit +
    - +
  • -
  • - +
  • +

    - Complimentary + Complimentary Archived

    Free of charge subscription

    - +
    - +
    $0 USD - +
    - +
    18 - +
    - +
    - - {{svg-jar "pen" class="w6 h6 fill-midgrey pa1 mr1"}} - - +
    - +
  • From f2e646ef43fbc84ffc4ac49cdba0acace9a076fa Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 15 Apr 2021 11:09:44 +0200 Subject: [PATCH 0106/3032] Removed member count from product list mock page --- app/templates/settings/products.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/settings/products.hbs b/app/templates/settings/products.hbs index fa3611c7f1..e24ee24347 100644 --- a/app/templates/settings/products.hbs +++ b/app/templates/settings/products.hbs @@ -29,7 +29,7 @@
    - 330 members + {{!-- 330 members --}} {{svg-jar "arrow-right" class="w6 h6 fill-midgrey pa1"}}
    From 9a7294038087137a96698da77493224194c32598 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 15 Apr 2021 17:58:35 +0200 Subject: [PATCH 0107/3032] Added mock member details component Prepring for custom products we'll change the overall layout of member forms. This commit has a component that's loaded when dev flag is on for the new layout with mocked product data. --- app/components/gh-member-settings-form-cp.hbs | 224 ++++++++++++++++++ app/components/gh-member-settings-form-cp.js | 107 +++++++++ app/styles/components/lists.css | 6 +- app/styles/layouts/main.css | 9 +- app/styles/layouts/members.css | 12 + app/templates/member.hbs | 18 +- 6 files changed, 365 insertions(+), 11 deletions(-) create mode 100644 app/components/gh-member-settings-form-cp.hbs create mode 100644 app/components/gh-member-settings-form-cp.js diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs new file mode 100644 index 0000000000..dce349be4f --- /dev/null +++ b/app/components/gh-member-settings-form-cp.hbs @@ -0,0 +1,224 @@ +
    + +
    +
    +
    +
    + {{#if (or this.member.name this.member.email)}} + + {{else}} +
    + N +
    + {{/if}} +
    +

    + {{or this.member.name this.member.email}} +

    +

    + {{#if (and this.member.name this.member.email)}} + {{this.member.email}} + {{/if}} +

    + {{#unless this.member.isNew}} +

    + {{#if this.member.geolocation}} + {{#if (and (eq this.member.geolocation.country_code "US") @member.geolocation.region)}} + {{this.member.geolocation.region}}, US + {{else}} + {{or this.member.geolocation.country "Unknown location"}} + {{/if}} + {{else}} + Unknown location + {{/if}} + – Created on {{moment-format @member.createdAtUTC "D MMM YYYY"}} +

    + {{/unless}} +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + +
    + + + + + + + + + + +

    Maximum: 500 characters. You’ve used + {{gh-count-down-characters this.scratchMember.note 500}}

    +
    + + +
    +
    +

    Subscribed to newsletter

    +

    If disabled, member will not receive newsletter emails

    +
    +
    + +
    +
    +
    +
    +
    + + {{#if this.canShowStripeInfo}} + {{#if this.subscriptions}} +

    Stripe info

    +
    +
    +
    +
    + + + + + + + + + +
    Name + {{#if customer.name}} + {{customer.name}} + {{else}} + No name + {{/if}} +
    Email + {{#if customer.email}} + {{customer.email}} + {{else}} + No email + {{/if}} +
    +
    +
    +
    +
    + + + + + +
    Card + No card info +
    +
    +
    +
    + +
    + {{/if}} + {{/if}} + +

    Products

    +
    +
      +
    1. +
      +
      +
    2. +
    3. +
      +

      + Product 1 +

      +

      + Description +

      +
      + +
      +
      + Edit + +
      +
      +
    4. +
    5. +
      +

      + Product 2 Cancelled +

      +

      + Cancelled product +

      +
      + +
      +
      + +
      +
      +
    6. +
    + + {{!-- --}} +
    +
    +
    +
    +
    Emails received
    +
    {{@member.emailCount}}
    +
    Emails opened
    +
    {{@member.emailOpenedCount}}
    +
    Avg. open rate
    +
    + {{#if (is-empty @member.emailOpenRate)}} + + {{else}} + {{@member.emailOpenRate}}% + {{/if}} +
    +
    + +

    Member activity

    +
    + +
    + +
    +
    + +
    \ No newline at end of file diff --git a/app/components/gh-member-settings-form-cp.js b/app/components/gh-member-settings-form-cp.js new file mode 100644 index 0000000000..15e58c3c71 --- /dev/null +++ b/app/components/gh-member-settings-form-cp.js @@ -0,0 +1,107 @@ +import Component from '@ember/component'; +import moment from 'moment'; +import {action} from '@ember/object'; +import {computed} from '@ember/object'; +import {gt} from '@ember/object/computed'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency'; + +export default Component.extend({ + membersUtils: service(), + feature: service(), + config: service(), + mediaQueries: service(), + ghostPaths: service(), + ajax: service(), + store: service(), + + stripeDetailsType: 'subscription', + + // Allowed actions + setProperty: () => {}, + + hasMultipleSubscriptions: gt('member.subscriptions', 1), + + canShowStripeInfo: computed('member.isNew', 'membersUtils.isStripeEnabled', function () { + let stripeEnabled = this.membersUtils.isStripeEnabled; + + if (this.member.get('isNew') || !stripeEnabled) { + return false; + } else { + return true; + } + }), + + subscriptions: computed('member.subscriptions', function () { + let subscriptions = this.member.get('subscriptions'); + if (subscriptions && subscriptions.length > 0) { + return subscriptions.map((subscription) => { + const statusLabel = subscription.status ? subscription.status.replace('_', ' ') : ''; + return { + id: subscription.id, + customer: subscription.customer, + name: subscription.name || '', + email: subscription.email || '', + status: subscription.status, + statusLabel: statusLabel, + startDate: subscription.start_date ? moment(subscription.start_date).format('D MMM YYYY') : '-', + plan: subscription.plan, + amount: parseInt(subscription.plan.amount) ? (subscription.plan.amount / 100) : 0, + cancelAtPeriodEnd: subscription.cancel_at_period_end, + cancellationReason: subscription.cancellation_reason, + validUntil: subscription.current_period_end ? moment(subscription.current_period_end).format('D MMM YYYY') : '-' + }; + }).reverse(); + } + return null; + }), + + customer: computed('subscriptions.[]', function () { + let customer = this.subscriptions.firstObject?.customer; + if (customer) { + return Object.assign({}, this.subscriptions.firstObject?.customer, { + startDate: this.subscriptions.firstObject?.startDate + }); + } + return null; + }), + + actions: { + setProperty(property, value) { + this.setProperty(property, value); + }, + setLabels(labels) { + this.member.set('labels', labels); + } + }, + + changeStripeDetailsType: action(function (type) { + this.set('stripeDetailsType', type); + }), + + cancelSubscription: task(function* (subscriptionId) { + let url = this.get('ghostPaths.url').api('members', this.member.get('id'), 'subscriptions', subscriptionId); + + let response = yield this.ajax.put(url, { + data: { + cancel_at_period_end: true + } + }); + + this.store.pushPayload('member', response); + return response; + }).drop(), + + continueSubscription: task(function* (subscriptionId) { + let url = this.get('ghostPaths.url').api('members', this.member.get('id'), 'subscriptions', subscriptionId); + + let response = yield this.ajax.put(url, { + data: { + cancel_at_period_end: false + } + }); + + this.store.pushPayload('member', response); + return response; + }).drop() +}); diff --git a/app/styles/components/lists.css b/app/styles/components/lists.css index dfbae7bf0a..ada9e835d7 100644 --- a/app/styles/components/lists.css +++ b/app/styles/components/lists.css @@ -57,11 +57,15 @@ ul.nostyle li { font-weight: 500; letter-spacing: 0.1px; color: var(--black); - text-transform: uppercase; padding: 10px 20px; + text-transform: uppercase; white-space: nowrap; } +.gh-list-row.header.empty .gh-list-header { + padding: 0; +} + .gh-list:not(.tabbed) .gh-list-header:first-child { border-top-left-radius: 5px; padding-left: 0; diff --git a/app/styles/layouts/main.css b/app/styles/layouts/main.css index 5ece60d263..4f694aafa1 100644 --- a/app/styles/layouts/main.css +++ b/app/styles/layouts/main.css @@ -1155,15 +1155,14 @@ grid-column-gap: 24px; } - -.gh-main-section-content.grey { - background: var(--main-color-content-greybg); -} - .gh-main-section-content.padding-top-s { padding-top: 16px; } +.gh-main-section-content + .gh-main-section-header { + margin-top: 24px; +} + .gh-main-section-block.stretch-height { height: 100%; display: flex; diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index b73a3d14d6..73bfcbf659 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1533,4 +1533,16 @@ p.gh-members-import-errordetail:first-of-type { .gh-members-emailpreview-container { transform: scale(0.9); } +} + + +/* Custom product member details */ +.gh-cp-member-email-name { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 24px; +} + +.gh-cp-data-summary:not(:last-of-type) { + margin-bottom: 24px; } \ No newline at end of file diff --git a/app/templates/member.hbs b/app/templates/member.hbs index ffa493d47f..f104b2e0ad 100644 --- a/app/templates/member.hbs +++ b/app/templates/member.hbs @@ -27,11 +27,19 @@
    - + {{#if (enable-developer-experiments)}} + + {{else}} + + {{/if}} {{#unless this.member.isNew}} From e90843ffa6ca0537af89ff4dc19545394cbe5060 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Apr 2021 18:31:14 +0100 Subject: [PATCH 0108/3032] Update dependency @tryghost/helpers to v1.1.42 (#1916) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ce34e218cb..31699d930b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "2.0.0", - "@tryghost/helpers": "1.1.41", + "@tryghost/helpers": "1.1.42", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", "@tryghost/limit-service": "0.4.1", diff --git a/yarn.lock b/yarn.lock index b2da60be7a..d90b30f025 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1884,10 +1884,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@tryghost/helpers@1.1.41": - version "1.1.41" - resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.41.tgz#814a4969bca184826cba407fc3e6d651fef4473c" - integrity sha512-6JvLY38gE6y7kNQX+vlDJzfVHK0gGeODH6s07KZ7d/rpnPEuT3XeD2E2LLzhPC2XpLr6E4WH8oI6xQzCh9sqsw== +"@tryghost/helpers@1.1.42": + version "1.1.42" + resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.42.tgz#950c4f0d8a5d4a001642d97bfa9c6a76e139dcf3" + integrity sha512-jM6ky0K9+RgFatv+kfMbdFcEdnkU6iRpR/IaOWAmgZkvY6fOWnEngL5+Nl3p9wONzrQl9pAvAZiS29UHzF18qw== dependencies: lodash-es "^4.17.11" From c261777dd09112a6b43f041a2ad0cc568da651f4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Apr 2021 22:41:49 +0100 Subject: [PATCH 0109/3032] Update dependency @tryghost/timezone-data to v0.2.40 (#1917) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 31699d930b..e806c6457f 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.17", - "@tryghost/timezone-data": "0.2.39", + "@tryghost/timezone-data": "0.2.40", "autoprefixer": "9.8.6", "babel-eslint": "10.1.0", "blueimp-md5": "2.18.0", diff --git a/yarn.lock b/yarn.lock index d90b30f025..2c5fedff72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1932,10 +1932,10 @@ dependencies: unidecode "^0.1.8" -"@tryghost/timezone-data@0.2.39": - version "0.2.39" - resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.39.tgz#1653a18421eb22af7e7d86a7e2007cff9ce63e6e" - integrity sha512-22qY7xvNYEa6BUu7IKG7wbUETN/RDrVyRr9NQkzeip7q0qLvShFXeoMOULmXri2JP627uBW9Y2WGi9DSnIegMw== +"@tryghost/timezone-data@0.2.40": + version "0.2.40" + resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.40.tgz#5dabb6c56556373c76e55d26c53684ab6aad91ab" + integrity sha512-OURbRtXevj1DUOZ4IyvpD022nG6phQGzLietMrfXtjnuvEeHyVQf7gqVCtVMPriCzoSqAcLVbgF61Y53XvMPLQ== "@types/acorn@^4.0.3": version "4.0.5" From ac79da253beefd3237e6f1fb078083981b515f80 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 15:28:27 +0100 Subject: [PATCH 0110/3032] Update dependency @tryghost/helpers to v1.1.43 (#1918) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e806c6457f..001b57462a 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "2.0.0", - "@tryghost/helpers": "1.1.42", + "@tryghost/helpers": "1.1.43", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", "@tryghost/limit-service": "0.4.1", diff --git a/yarn.lock b/yarn.lock index 2c5fedff72..e935ffc5a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1884,10 +1884,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@tryghost/helpers@1.1.42": - version "1.1.42" - resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.42.tgz#950c4f0d8a5d4a001642d97bfa9c6a76e139dcf3" - integrity sha512-jM6ky0K9+RgFatv+kfMbdFcEdnkU6iRpR/IaOWAmgZkvY6fOWnEngL5+Nl3p9wONzrQl9pAvAZiS29UHzF18qw== +"@tryghost/helpers@1.1.43": + version "1.1.43" + resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.43.tgz#75e7677340e6f956db620cb7d29e8acadab4800d" + integrity sha512-Hviu65xnMG1w8j/ibTjqxoJyh4ZkCy2y3IURagZ16FfAiORKPYmGXbQb8ueDsazVnATfrhj1fzc18aTqf9w4lg== dependencies: lodash-es "^4.17.11" From 311b3ff67b52e365e70e4e2da83ad2d5ed72b696 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 15:28:39 +0100 Subject: [PATCH 0111/3032] Update dependency @tryghost/string to v0.1.18 (#1919) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 001b57462a..8071b8793a 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@tryghost/limit-service": "0.4.1", "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", - "@tryghost/string": "0.1.17", + "@tryghost/string": "0.1.18", "@tryghost/timezone-data": "0.2.40", "autoprefixer": "9.8.6", "babel-eslint": "10.1.0", diff --git a/yarn.lock b/yarn.lock index e935ffc5a2..9ce7f9b76c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1925,10 +1925,10 @@ mobiledoc-dom-renderer "0.7.0" mobiledoc-text-renderer "0.4.0" -"@tryghost/string@0.1.17": - version "0.1.17" - resolved "https://registry.yarnpkg.com/@tryghost/string/-/string-0.1.17.tgz#deebdfcc0440e71ee8ff8101c9d30bd4a746a768" - integrity sha512-Z2BD7jOEG2ak28crhY6iaN/BqAi6ksNBUHzoknXmmoAN7UPGMuuMQ4PLu5kHUl6AGW/lIeBDoM0IfF4jkM6D0g== +"@tryghost/string@0.1.18": + version "0.1.18" + resolved "https://registry.yarnpkg.com/@tryghost/string/-/string-0.1.18.tgz#2cc8f92ad80d055c872731dd5410383920e934cf" + integrity sha512-fIHteQ2plScj08OQrlDVfRZMCoocrSOmXkMC+TFe7WEIl/QFw2HKDWJeWxr6CADve2RUDzLJzJh71KL6u61bTw== dependencies: unidecode "^0.1.8" From 082a078e05fb8cc95c2cf80b469471e276b036db Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 15:28:58 +0100 Subject: [PATCH 0112/3032] Update dependency markdown-it to v12.0.6 (#1921) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 8071b8793a..403d53c103 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "liquid-fire": "0.31.0", "liquid-wormhole": "2.1.5", "loader.js": "4.7.0", - "markdown-it": "12.0.5", + "markdown-it": "12.0.6", "markdown-it-footnote": "3.0.2", "markdown-it-lazy-headers": "0.1.3", "markdown-it-mark": "3.0.1", diff --git a/yarn.lock b/yarn.lock index 9ce7f9b76c..1b368d1f43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10878,10 +10878,10 @@ markdown-it-terminal@0.2.1: lodash.merge "^4.6.2" markdown-it "^8.3.1" -markdown-it@12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.5.tgz#982907947dc1f72f9d651c5286678fd95af13f2e" - integrity sha512-9KB992Yy2TedaoKETgZPL2n3bmqqZxzUsZ4fxe2ho+/AYuQUz+iDKpfjLgKbg/lHcG6cGOj+L3gDrn9S2CxoRg== +markdown-it@12.0.6: + version "12.0.6" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.6.tgz#adcc8e5fe020af292ccbdf161fe84f1961516138" + integrity sha512-qv3sVLl4lMT96LLtR7xeRJX11OUFjsaD5oVat2/SNBIb21bJXwal2+SklcRbTwGwqWpWH/HRtYavOoJE+seL8w== dependencies: argparse "^2.0.1" entities "~2.1.0" From 37286bd0e582bc61c8ab9bdb19a2aca7110eb6e2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Apr 2021 16:49:28 +0100 Subject: [PATCH 0113/3032] Update dependency @tryghost/timezone-data to v0.2.41 (#1920) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 403d53c103..cbab4240b4 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.18", - "@tryghost/timezone-data": "0.2.40", + "@tryghost/timezone-data": "0.2.41", "autoprefixer": "9.8.6", "babel-eslint": "10.1.0", "blueimp-md5": "2.18.0", diff --git a/yarn.lock b/yarn.lock index 1b368d1f43..ca9e86b812 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1932,10 +1932,10 @@ dependencies: unidecode "^0.1.8" -"@tryghost/timezone-data@0.2.40": - version "0.2.40" - resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.40.tgz#5dabb6c56556373c76e55d26c53684ab6aad91ab" - integrity sha512-OURbRtXevj1DUOZ4IyvpD022nG6phQGzLietMrfXtjnuvEeHyVQf7gqVCtVMPriCzoSqAcLVbgF61Y53XvMPLQ== +"@tryghost/timezone-data@0.2.41": + version "0.2.41" + resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.41.tgz#ab8251c65c867120ab927237513c56594c18a3be" + integrity sha512-mpXrEJyTBMqaq4K4cuPfrGR8f149f+puIrRJc0bxazMbFeEAXsFQwBsKMN/aw4xh4F6y3jmNjaQeEXfr4cP5sw== "@types/acorn@^4.0.3": version "4.0.5" From 3607c90f74bdeb24f8158812b2e58d5dba50c23e Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Fri, 16 Apr 2021 17:44:15 +0100 Subject: [PATCH 0114/3032] v4.2.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c14251a21..421bf11937 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.2.1", + "version": "4.2.2", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 601de7cb9c28e368e7aa526d6382f174be040218 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 19 Apr 2021 10:42:53 +0200 Subject: [PATCH 0115/3032] Updated member product list mock design --- app/components/gh-member-settings-form-cp.hbs | 92 ++++++++++---- app/styles/layouts/members.css | 116 ++++++++++++++++++ 2 files changed, 181 insertions(+), 27 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index dce349be4f..db232bee7d 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -104,24 +104,24 @@
    - +
    - + - + @@ -130,11 +130,11 @@
    -
    NameName: {{#if customer.name}} {{customer.name}} {{else}} - No name + No name {{/if}}
    EmailEmail: {{#if customer.email}} {{customer.email}} {{else}} - No email + No email {{/if}}
    +
    - +
    CardCard: - No card info + **** **** **** 4242
    @@ -142,7 +142,7 @@
    @@ -152,44 +152,82 @@

    Products

    -
      +
      1. -
        -

        - Product 1 +
        +

        + Product 1 Active

        -

        - Description -

        +
        + + + +
        + Created on 9 April 2021 + + View on Stripe + +
        +
        -
        -
        - Edit +
        +
        + Edit

      2. -
      3. -
        -

        +
      4. +
        +

        Product 2 Cancelled

        -

        - Cancelled product -

        +
        + + + +
        + Created on 9 April 2021 + + View on Stripe + +
        +
        -
        -
        +
        +
      5. + + + + {{svg-jar "add"}} + Add product + + +

      {{!--
    - - {{!-- --}}
    @@ -259,4 +254,11 @@
    - \ No newline at end of file + + +{{#if this.showMemberProductModal}} + +{{/if}} \ No newline at end of file diff --git a/app/components/gh-member-settings-form-cp.js b/app/components/gh-member-settings-form-cp.js index 15e58c3c71..5698651d14 100644 --- a/app/components/gh-member-settings-form-cp.js +++ b/app/components/gh-member-settings-form-cp.js @@ -103,5 +103,9 @@ export default Component.extend({ this.store.pushPayload('member', response); return response; - }).drop() + }).drop(), + + closeMemberProductModal: action(function () { + this.set('showMemberProductModal', false); + }) }); diff --git a/app/components/gh-products-price-billingperiod.js b/app/components/gh-products-price-billingperiod.js index c5a340b3d8..96dc899efb 100644 --- a/app/components/gh-products-price-billingperiod.js +++ b/app/components/gh-products-price-billingperiod.js @@ -1,15 +1,8 @@ import Component from '@ember/component'; const PERIODS = [ - {label: 'Daily', period: 'daily'}, - {label: 'Weekly', period: 'members'}, {label: 'Monthly', period: 'monthly'}, - {label: 'Every 3 months', period: '3-months'}, - {label: 'Every 6 months', period: '6-months'}, - {label: 'Yearly', period: 'yearly'}, - {label: 'Custom', period: 'custom'}, - {label: 'One time', period: 'one-time'}, - {label: 'Unbilled', period: 'unbilled'} + {label: 'Yearly', period: 'yearly'} ]; export default Component.extend({ diff --git a/app/components/modal-member-product.hbs b/app/components/modal-member-product.hbs new file mode 100644 index 0000000000..b29ae7353c --- /dev/null +++ b/app/components/modal-member-product.hbs @@ -0,0 +1,55 @@ +{{!-- --}} + + +
    + +
    + + \ No newline at end of file diff --git a/app/components/modal-member-product.js b/app/components/modal-member-product.js new file mode 100644 index 0000000000..f3be7ef125 --- /dev/null +++ b/app/components/modal-member-product.js @@ -0,0 +1,6 @@ +import ModalComponent from 'ghost-admin/components/modal-base'; +import {alias} from '@ember/object/computed'; + +export default ModalComponent.extend({ + member: alias('model') +}); \ No newline at end of file diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index 10ac409b6c..24fdf282d8 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1648,17 +1648,27 @@ p.gh-members-import-errordetail:first-of-type { padding: 12px 0; } -.gh-memberproduct-add-product .gh-list-data a { +.gh-memberproduct-add-product .gh-btn svg path { + fill: var(--green); +} + +.gh-member-product-memberdetails { display: flex; + flex-direction: column; align-items: center; + margin: 12px 0 24px; } -.gh-memberproduct-add-product .gh-list-data a svg { - width: 16px; - height: 16px; - margin-right: 4px; +.gh-member-product-memberdetails .gh-member-gravatar { + margin: 0; } -.gh-memberproduct-add-product .gh-list-data a svg path { - fill: var(--green); +.gh-member-product-memberdetails h3 { + margin: 12px 0 0; + font-size: 1.9rem; + line-height: 1; +} + +.gh-member-product-memberdetails p { + margin: 0; } \ No newline at end of file diff --git a/app/styles/patterns/buttons.css b/app/styles/patterns/buttons.css index 9495905a95..554ce84311 100644 --- a/app/styles/patterns/buttons.css +++ b/app/styles/patterns/buttons.css @@ -331,6 +331,10 @@ svg.gh-btn-icon-right { color: color-mod(var(--yellow) l(-10%)); } +.gh-btn-text.green span { + color: var(--green); +} + .gh-btn-textfield-group span { height: 36px; line-height: 36px; From b7fe1dc39213c2c18b7531f29c9c689007db0361 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 16 Apr 2021 15:33:02 +0100 Subject: [PATCH 0117/3032] Updated setting model for new `members_signup_access` setting requires https://github.com/TryGhost/Ghost/pull/12886 - renamed `membersAllowFreeSignup` to `membersSignupAccess` and changed type to match new setting - added `membersAllowFreeSignup` computed property to map to the new setting to avoid having to migrate code elsewhere that will be removed once the new options are out of developer experiments --- app/controllers/settings/members-access.js | 10 +++++----- app/models/setting.js | 18 ++++++++++++++++-- app/templates/settings/members-access.hbs | 8 ++++---- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/app/controllers/settings/members-access.js b/app/controllers/settings/members-access.js index c6a9ba155d..be234da81b 100644 --- a/app/controllers/settings/members-access.js +++ b/app/controllers/settings/members-access.js @@ -8,7 +8,7 @@ export default class MembersAccessController extends Controller { @service settings; @tracked showLeaveSettingsModal = false; - @tracked subscriptionAccessOpen = false; + @tracked signupAccessOpen = false; @tracked postAccessOpen = false; leaveRoute(transition) { @@ -33,8 +33,8 @@ export default class MembersAccessController extends Controller { } @action - toggleSubscriptionAccess() { - this.subscriptionAccessOpen = !this.subscriptionAccessOpen; + toggleSignupAccess() { + this.signupAccessOpen = !this.signupAccessOpen; } @action @@ -48,9 +48,9 @@ export default class MembersAccessController extends Controller { } @action - setSubscriptionAccess(value) { + setSignupAccess(value) { switch (value) { - case 'anyone': + case 'all': this.settings.set('membersAllowFreeSignup', true); break; diff --git a/app/models/setting.js b/app/models/setting.js index fc5f2e7690..bdeb135c15 100644 --- a/app/models/setting.js +++ b/app/models/setting.js @@ -1,6 +1,7 @@ /* eslint-disable camelcase */ import Model, {attr} from '@ember-data/model'; import ValidationEngine from 'ghost-admin/mixins/validation-engine'; +import {computed} from '@ember/object'; export default Model.extend(ValidationEngine, { validationType: 'setting', @@ -52,7 +53,7 @@ export default Model.extend(ValidationEngine, { * Members settings */ defaultContentVisibility: attr('string'), - membersAllowFreeSignup: attr('boolean'), + membersSignupAccess: attr('string'), membersFromAddress: attr('string'), membersSupportAddress: attr('string'), membersReplyAddress: attr('string'), @@ -74,5 +75,18 @@ export default Model.extend(ValidationEngine, { newsletterShowHeader: attr('boolean'), newsletterBodyFontCategory: attr('string'), newsletterShowBadge: attr('boolean'), - newsletterFooterContent: attr('string') + newsletterFooterContent: attr('string'), + + // TODO: remove when Access screen with "Nobody" option is out of dev experiments + membersAllowFreeSignup: computed('membersSignupAccess', { + get() { + const signupAccess = this.membersSignupAccess; + return signupAccess === 'all' ? true : false; + }, + set(key, allowFreeSignup) { + const signupAccess = allowFreeSignup ? 'all' : 'invite'; + this.set('membersSignupAccess', signupAccess); + return allowFreeSignup; + } + }) }); diff --git a/app/templates/settings/members-access.hbs b/app/templates/settings/members-access.hbs index 91812b27e5..c0f962c87b 100644 --- a/app/templates/settings/members-access.hbs +++ b/app/templates/settings/members-access.hbs @@ -25,14 +25,14 @@

    Subscription access

    Who should be able to subscribe to your site?

    - +
    - {{#liquid-if this.subscriptionAccessOpen}} + {{#liquid-if this.signupAccessOpen}}
    @@ -43,7 +43,7 @@
    From 384d0edf7d6c7976e6847f5264d1f0a7c42bab9f Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 19 Apr 2021 11:34:20 +0100 Subject: [PATCH 0118/3032] Added "Nobody" option to members signup access refs https://github.com/TryGhost/Team/issues/579 - adds "Nobody" option that will set `members_signup_access` setting to `'none'` - when selected also sets `default_content_visibility` setting to `'public'`, expands it if collapsed and disables other options (that setting doesn't make sense when members is disabled, individual post access can still be set manually if needed) --- app/controllers/settings/members-access.js | 16 +++---- app/styles/patterns/forms.css | 4 ++ app/templates/settings/members-access.hbs | 53 +++++++++++++--------- 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/app/controllers/settings/members-access.js b/app/controllers/settings/members-access.js index be234da81b..28689eb06a 100644 --- a/app/controllers/settings/members-access.js +++ b/app/controllers/settings/members-access.js @@ -44,19 +44,17 @@ export default class MembersAccessController extends Controller { @action setDefaultContentVisibility(value) { - this.settings.set('defaultContentVisibility', value); + if (this.settings.get('membersSignupAccess') !== 'none') { + this.settings.set('defaultContentVisibility', value); + } } @action setSignupAccess(value) { - switch (value) { - case 'all': - this.settings.set('membersAllowFreeSignup', true); - break; - - case 'invite': - this.settings.set('membersAllowFreeSignup', false); - break; + this.settings.set('membersSignupAccess', value); + if (value === 'none') { + this.settings.set('defaultContentVisibility', 'public'); + this.postAccessOpen = true; } } diff --git a/app/styles/patterns/forms.css b/app/styles/patterns/forms.css index 266cafce11..da8b148a68 100644 --- a/app/styles/patterns/forms.css +++ b/app/styles/patterns/forms.css @@ -49,6 +49,10 @@ input { color: var(--red); } +.disabled-overlay { + pointer-events: none; + opacity: 0.5; +} /* Form Groups /* ---------------------------------------------------------- */ diff --git a/app/templates/settings/members-access.hbs b/app/templates/settings/members-access.hbs index c0f962c87b..f81bdc0e8a 100644 --- a/app/templates/settings/members-access.hbs +++ b/app/templates/settings/members-access.hbs @@ -31,7 +31,7 @@ {{#liquid-if this.signupAccessOpen}}
    @@ -42,7 +42,7 @@
    @@ -51,6 +51,17 @@ People can sign in from your site but won't be able to sign up
    + +
    +
    +
    +
    Nobody
    + No one will be able to subscribe or sign in +
    +
    {{/liquid-if}}
    @@ -79,26 +90,26 @@ All site visitors to your site, no login required
    - -
    -
    -
    -
    Members only
    - All logged-in members
    +
    +
    +
    +
    +
    Members only
    + All logged-in members
    +
    -
    - -
    -
    -
    -
    Paid-members only
    - Only logged-in members with an active Stripe subscription
    +
    +
    +
    +
    Paid-members only
    + Only logged-in members with an active Stripe subscription
    +
    From a4676f06afed390a4e7f69b3ec4cc6fc15cfabef Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 09:01:04 +0100 Subject: [PATCH 0119/3032] Compacted dashboard controller tracked property code style --- app/controllers/dashboard.js | 54 ++++++++++++------------------------ 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/app/controllers/dashboard.js b/app/controllers/dashboard.js index 14344f7126..917014b84c 100644 --- a/app/controllers/dashboard.js +++ b/app/controllers/dashboard.js @@ -12,47 +12,29 @@ export default class DashboardController extends Controller { @service settings; @service whatsNew; - @tracked - eventsData = null; - @tracked - eventsError = null; - @tracked - eventsLoading = false; + @tracked eventsData = null; + @tracked eventsError = null; + @tracked eventsLoading = false; - @tracked - mrrStatsData = null; - @tracked - mrrStatsError = null; - @tracked - mrrStatsLoading = false; + @tracked mrrStatsData = null; + @tracked mrrStatsError = null; + @tracked mrrStatsLoading = false; - @tracked - memberCountStatsData = null; - @tracked - memberCountStatsError = null; - @tracked - memberCountStatsLoading = false; + @tracked memberCountStatsData = null; + @tracked memberCountStatsError = null; + @tracked memberCountStatsLoading = false; - @tracked - topMembersData = null; - @tracked - topMembersError = null; - @tracked - topMembersLoading = false; + @tracked topMembersData = null; + @tracked topMembersError = null; + @tracked topMembersLoading = false; - @tracked - newsletterOpenRatesData = null; - @tracked - newsletterOpenRatesError = null; - @tracked - newsletterOpenRatesLoading = false; + @tracked newsletterOpenRatesData = null; + @tracked newsletterOpenRatesError = null; + @tracked newsletterOpenRatesLoading = false; - @tracked - whatsNewEntries = null; - @tracked - whatsNewEntriesLoading = null; - @tracked - whatsNewEntriesError = null; + @tracked whatsNewEntries = null; + @tracked whatsNewEntriesLoading = null; + @tracked whatsNewEntriesError = null; get topMembersDataHasOpenRates() { return this.topMembersData && this.topMembersData.find((member) => { From 8bd782c3c291e689b2c737a0746067f95e55194b Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 09:08:15 +0100 Subject: [PATCH 0120/3032] Hid members data in dashboard when signup access is "Nobody" refs https://github.com/TryGhost/Team/issues/579 Members is essentially disabled when signup access is set to "Nobody" so it doesn't make sense to show members related charts and actions in the dashboard. - adds `showMembersData` property to the dashboard controller that returns `false` when members is disabled - wraps members related sections of the dashboard in conditionals --- app/controllers/dashboard.js | 4 + app/templates/dashboard.hbs | 140 ++++++++++++++++++----------------- 2 files changed, 76 insertions(+), 68 deletions(-) diff --git a/app/controllers/dashboard.js b/app/controllers/dashboard.js index 917014b84c..63f734041e 100644 --- a/app/controllers/dashboard.js +++ b/app/controllers/dashboard.js @@ -42,6 +42,10 @@ export default class DashboardController extends Controller { }); } + get showMembersData() { + return this.settings.get('membersSignupAccess') !== 'none'; + } + initialise() { this.loadEvents(); this.loadTopMembers(); diff --git a/app/templates/dashboard.hbs b/app/templates/dashboard.hbs index 2846873765..3e0025c489 100644 --- a/app/templates/dashboard.hbs +++ b/app/templates/dashboard.hbs @@ -26,7 +26,7 @@
    - {{else}} + {{else if this.showMembersData}}
    @@ -141,13 +141,15 @@

    Start creating content

    - - {{svg-jar "members"}} -
    -

    Create your first member

    -

    Add yourself or import members from CSV

    -
    -
    + {{#if this.showMembersData}} + + {{svg-jar "members"}} +
    +

    Create your first member

    +

    Add yourself or import members from CSV

    +
    +
    + {{/if}} {{svg-jar "posts"}}
    @@ -181,7 +183,7 @@
    - +
    @@ -256,75 +258,77 @@
    - {{#if this.topMembersData}} -
    -
    -

    Top members

    - {{#if this.topMembersDataHasOpenRates}} -

    Open rate

    - {{else}} -

    Member since

    - {{/if}} -
    -
    - {{#if this.topMembersLoading}} - Loading... - {{else}} - {{#if this.topMembersError}} -

    - There was an error loading member events. - -

    + {{#if this.showMembersData}} + {{#if this.topMembersData}} +
    +
    +

    Top members

    + {{#if this.topMembersDataHasOpenRates}} +

    Open rate

    {{else}} -
      - {{#each this.topMembersData as |member|}} -
    • - - - {{#if member.name}} - {{member.name}} +

      Member since

      + {{/if}} +
    +
    + {{#if this.topMembersLoading}} + Loading... + {{else}} + {{#if this.topMembersError}} +

    + There was an error loading member events. + +

    + {{else}} +
      + {{#each this.topMembersData as |member|}} +
    • + + + {{#if member.name}} + {{member.name}} + {{else}} + + {{/if}} + + {{#if member.emailOpenRate}} + {{member.emailOpenRate}}% {{else}} - + + {{moment-format member.createdAtUTC "D MMM YYYY"}} + {{/if}} - - {{#if member.emailOpenRate}} - {{member.emailOpenRate}}% - {{else}} - - {{moment-format member.createdAtUTC "D MMM YYYY"}} - - {{/if}} -
    • - {{/each}} -
    + + {{/each}} + + {{/if}} {{/if}} - {{/if}} -
    -
    - {{/if}} + {{/if}} - {{#unless (and this.session.user.isOwner (not this.feature.launchComplete))}} -
    -

    Activity feed

    -
    - {{#if this.eventsLoading}} - Loading... - {{else}} - {{#if this.eventsError}} -

    - There was an error loading events - {{this.eventsError.message}} -

    + {{#unless (and this.session.user.isOwner (not this.feature.launchComplete))}} +
    +

    Activity feed

    +
    + {{#if this.eventsLoading}} + Loading... {{else}} - + {{#if this.eventsError}} +

    + There was an error loading events + {{this.eventsError.message}} +

    + {{else}} + + {{/if}} {{/if}} - {{/if}} +
    -
    - {{/unless}} + {{/unless}} + {{/if}} {{#unless (or whatsNewEntriesLoading whatsNewEntriesError)}}
    From 308ef3578760c28bf8adc16891b0294ef79ad27b Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Tue, 20 Apr 2021 11:31:22 +0200 Subject: [PATCH 0121/3032] Styled access settings Refs https://github.com/TryGhost/Team/issues/579 --- app/styles/layouts/main.css | 5 +++-- app/styles/layouts/users.css | 13 ------------- app/styles/patterns/forms.css | 11 ++++++----- app/templates/settings/members-access.hbs | 14 ++++++-------- 4 files changed, 15 insertions(+), 28 deletions(-) diff --git a/app/styles/layouts/main.css b/app/styles/layouts/main.css index 4f694aafa1..597e04962b 100644 --- a/app/styles/layouts/main.css +++ b/app/styles/layouts/main.css @@ -1208,10 +1208,11 @@ } .gh-expandable-header .gh-expandable-description { - font-size: 1.3rem; - color: var(--midgrey); margin: 0; padding: 0; + color: var(--midgrey); + font-size: 1.3rem; + font-weight: 400; } .gh-expandable-content { diff --git a/app/styles/layouts/users.css b/app/styles/layouts/users.css index 47e1e9ccbd..0dfb21d790 100644 --- a/app/styles/layouts/users.css +++ b/app/styles/layouts/users.css @@ -206,19 +206,6 @@ margin-right: 2.4rem; } -.gh-roles-container .gh-radio-label { - padding-bottom: 4px; - line-height: 1.1em; - font-weight: 600; -} - -.gh-roles-container .gh-radio-desc { - color: var(--midgrey); - font-size: 1.3rem; - line-height: 1.2em; - font-weight: 400; -} - .gh-roles-container .popover { width: 97%; border: 1px solid var(--whitegrey-d1); diff --git a/app/styles/patterns/forms.css b/app/styles/patterns/forms.css index da8b148a68..e53d28fe3b 100644 --- a/app/styles/patterns/forms.css +++ b/app/styles/patterns/forms.css @@ -331,7 +331,7 @@ textarea { .gh-radio { display: flex; - margin: 0 0 20px; + margin: 0 0 24px; } .gh-radio-button { @@ -354,14 +354,15 @@ textarea { .gh-radio-label { font-size: 1.4rem; line-height: 1.2em; - font-weight: 400; + font-weight: 600; } .gh-radio-desc { + margin: 4px 0 0; + color: var(--midgrey); font-size: 1.3rem; - line-height: 1.4em; - font-weight: 300; - color: color-mod(var(--midgrey) l(+10%)); + line-height: 1.2em; + font-weight: 400; } .gh-radio-label:hover, diff --git a/app/templates/settings/members-access.hbs b/app/templates/settings/members-access.hbs index f81bdc0e8a..9c9bf6d6c5 100644 --- a/app/templates/settings/members-access.hbs +++ b/app/templates/settings/members-access.hbs @@ -37,7 +37,7 @@
    Anyone can sign up
    - All visitors will be able to subscribe and sign in +
    All visitors will be able to subscribe and sign in
    @@ -48,7 +48,7 @@
    Only people I invite
    - People can sign in from your site but won't be able to sign up +
    People can sign in from your site but won't be able to sign up
    @@ -59,16 +59,14 @@
    Nobody
    - No one will be able to subscribe or sign in +
    No one will be able to subscribe or sign in
    {{/liquid-if}}
    - -

    @@ -87,7 +85,7 @@
    Public
    - All site visitors to your site, no login required
    +
    All site visitors to your site, no login required

    @@ -98,7 +96,7 @@
    Members only
    - All logged-in members
    +
    All logged-in members
    Paid-members only
    - Only logged-in members with an active Stripe subscription
    +
    Only logged-in members with an active Stripe subscription
    From 593be38b557f793dc41db38b6be9c589d6261c93 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 20 Apr 2021 10:08:26 +0000 Subject: [PATCH 0122/3032] Update dependency @tryghost/limit-service to v0.4.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 8e5c43c8db..1e4dd2b24d 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@tryghost/helpers": "1.1.43", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", - "@tryghost/limit-service": "0.4.1", + "@tryghost/limit-service": "0.4.2", "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.18", diff --git a/yarn.lock b/yarn.lock index ca9e86b812..9e14121543 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1903,10 +1903,10 @@ dependencies: "@tryghost/kg-clean-basic-html" "^1.0.17" -"@tryghost/limit-service@0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-0.4.1.tgz#c827e8a334854766f073520ae5dab12e132e0945" - integrity sha512-MYcW+s4+OfA9C/tI7e0ZKhxUk02tVhkcrBc/7p+BgiJnS+LdcgrV21xRqH/UhERotgOLcFRTHPt6bkqW1Lnhwg== +"@tryghost/limit-service@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-0.4.2.tgz#3f096d3f0b158ffb51411cb7f0f772fd216c5fce" + integrity sha512-bFT2nsLVJdfIKirHsLEoZk2ZDF9Gx0tSJomfoDRyc5iGnI7Vgy3FTemlAXjM50NfFH1VCFBZiH81QeoTxa7vbw== dependencies: lodash "^4.17.21" From 2a76054c9cca7c2a2675f8af372d607c9bd33c0c Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 13:39:03 +0100 Subject: [PATCH 0123/3032] Fixed invite staff modal button not reflecting validation state (#1924) no issue - when the role selection was extracted to an external component the limit validation was also extracted but had no way of feeding back to the consumer - added `onValidationSuccess` and `onValidationFailure` arguments to the role selection component to allow validation feedback to the consumer - updated staff invite modal with actions to update state based on validation so the modal's buttons can update accordingly --- app/components/gh-role-selection.js | 10 +++++++++- app/components/modal-invite-new-user.hbs | 2 ++ app/components/modal-invite-new-user.js | 10 +++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/components/gh-role-selection.js b/app/components/gh-role-selection.js index 8722f858bf..174731a192 100644 --- a/app/components/gh-role-selection.js +++ b/app/components/gh-role-selection.js @@ -34,15 +34,23 @@ export default class GhRoleSelectionComponent extends Component { } async validateRole(role) { + if (role.name === 'Contributor') { + this.args.onValidationSuccess?.(); + } + if (role.name !== 'Contributor' - && this.limit.limiter && this.limit.limiter.isLimited('staff')) { + && this.limit.limiter + && this.limit.limiter.isLimited('staff') + ) { try { await this.limit.limiter.errorIfWouldGoOverLimit('staff'); this.limitErrorMessage = null; + this.args.onValidationSuccess?.(); } catch (error) { if (error.errorType === 'HostLimitError') { this.limitErrorMessage = error.message; + this.args.onValidationFailure?.(this.limitErrorMessage); } else { this.notifications.showAPIError(error, {key: 'staff.limit'}); } diff --git a/app/components/modal-invite-new-user.hbs b/app/components/modal-invite-new-user.hbs index 6326bc16b7..b6f6738c0b 100644 --- a/app/components/modal-invite-new-user.hbs +++ b/app/components/modal-invite-new-user.hbs @@ -33,6 +33,8 @@ diff --git a/app/components/modal-invite-new-user.js b/app/components/modal-invite-new-user.js index fbb070bfae..0c8774c5eb 100644 --- a/app/components/modal-invite-new-user.js +++ b/app/components/modal-invite-new-user.js @@ -12,11 +12,11 @@ export default ModalComponent.extend(ValidationEngine, { router: service(), notifications: service(), store: service(), - limit: service(), classNames: 'modal-content invite-new-user', role: null, + limitErrorMessage: null, validationType: 'inviteUser', @@ -31,6 +31,14 @@ export default ModalComponent.extend(ValidationEngine, { actions: { confirm() { this.sendInvitation.perform(); + }, + + roleValidationFailed(reason) { + this.set('limitErrorMessage', reason); + }, + + roleValidationSucceeded() { + this.set('limitErrorMessage', null); } }, From 9fc2f52d42225116c82eba48cfb9578bbd78ba10 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Tue, 20 Apr 2021 15:57:08 +0200 Subject: [PATCH 0124/3032] Fixed modal overflow responsive issue --- app/styles/components/modals.css | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/styles/components/modals.css b/app/styles/components/modals.css index 58edd153aa..2dd4cff82f 100644 --- a/app/styles/components/modals.css +++ b/app/styles/components/modals.css @@ -35,10 +35,11 @@ .fullscreen-modal { position: relative; z-index: 100; + max-width: 550px; + overflow-y: auto; margin: auto; margin-top: 30px; margin-bottom: 30px; - max-width: 550px; pointer-events: none; } @@ -74,6 +75,12 @@ margin: 6vw 0; } +@media (max-height: 960px) { + .fullscreen-modal-action { + margin: 40px auto; + } +} + .fullscreen-modal-body-scrolling .modal-body { max-height: calc(100vh - 12vw - 12vmin - 24px - 34px - 64px); /* top and bottom margins + extra padding at the bottom + modal header & footer */ overflow-y: scroll; From 80de2a9ddcf045c912babcff9d2e58f777784de9 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 16:55:31 +0100 Subject: [PATCH 0125/3032] Removed unused code from `` no issue - code relating to "portal settings" and "leave settings" modals was unused, presumably left over from settings re-jig copy and paste --- .../gh-members-payments-setting.hbs | 16 -------------- app/components/gh-members-payments-setting.js | 22 ------------------- app/templates/settings/members-payments.hbs | 1 - 3 files changed, 39 deletions(-) diff --git a/app/components/gh-members-payments-setting.hbs b/app/components/gh-members-payments-setting.hbs index 889b01c234..05148fd5e5 100644 --- a/app/components/gh-members-payments-setting.hbs +++ b/app/components/gh-members-payments-setting.hbs @@ -288,20 +288,4 @@ @confirm={{action "disconnectStripeConnectIntegration"}} @close={{action "closeDisconnectStripeModal"}} @modifier="action wide" /> -{{/if}} - -{{#if this.showPortalSettings}} - -{{/if}} - -{{#if this.showLeaveSettingsModal}} - {{/if}} \ No newline at end of file diff --git a/app/components/gh-members-payments-setting.js b/app/components/gh-members-payments-setting.js index a9acb8ba72..9e5254afa4 100644 --- a/app/components/gh-members-payments-setting.js +++ b/app/components/gh-members-payments-setting.js @@ -19,7 +19,6 @@ export default Component.extend({ stripePlanInvalidAmount: false, _scratchStripeYearlyAmount: null, _scratchStripeMonthlyAmount: null, - showLeaveSettingsModal: false, // passed in actions setStripeConnectIntegrationTokenSetting() {}, @@ -38,8 +37,6 @@ export default Component.extend({ stripeConnectAccountName: reads('settings.stripeConnectDisplayName'), stripeConnectLivemode: reads('settings.stripeConnectLivemode'), - portalSettingsBorderColor: reads('settings.accentColor'), - selectedCurrency: computed('stripePlans.monthly.currency', function () { return this.get('currencies').findBy('value', this.get('stripePlans.monthly.currency')) || this.get('topCurrencies').findBy('value', this.get('stripePlans.monthly.currency')); }), @@ -106,15 +103,6 @@ export default Component.extend({ }, actions: { - closePortalSettings() { - const changedAttributes = this.settings.changedAttributes(); - if (changedAttributes && Object.keys(changedAttributes).length > 0) { - this.set('showLeaveSettingsModal', true); - } else { - this.set('showPortalSettings', false); - } - }, - setDefaultContentVisibility(value) { this.setDefaultContentVisibility(value); }, @@ -184,16 +172,6 @@ export default Component.extend({ this.disconnectStripeConnectIntegration.perform(); }, - closeLeaveSettingsModal() { - this.set('showLeaveSettingsModal', false); - }, - - leavePortalSettings() { - this.settings.rollbackAttributes(); - this.set('showPortalSettings', false); - this.set('showLeaveSettingsModal', false); - }, - openStripeSettings() { this.set('membersStripeOpen', true); } diff --git a/app/templates/settings/members-payments.hbs b/app/templates/settings/members-payments.hbs index 109a1f6873..520169ea16 100644 --- a/app/templates/settings/members-payments.hbs +++ b/app/templates/settings/members-payments.hbs @@ -21,7 +21,6 @@ {{#if this.session.user.isOwner}}
    From b574de34de2909c34cfa28bffe53b3673b45022f Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 17:02:43 +0100 Subject: [PATCH 0126/3032] Removed unused code from members-payments controller no issue - unused code was left over from settings re-jig copy and paste --- app/controllers/settings/members-payments.js | 26 -------------------- 1 file changed, 26 deletions(-) diff --git a/app/controllers/settings/members-payments.js b/app/controllers/settings/members-payments.js index e6e1cad3bf..a0cc6295ca 100644 --- a/app/controllers/settings/members-payments.js +++ b/app/controllers/settings/members-payments.js @@ -1,38 +1,12 @@ /* eslint-disable ghost/ember/alias-model-in-controller */ import Controller from '@ember/controller'; -import {computed} from '@ember/object'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency'; export default Controller.extend({ - ajax: service(), - config: service(), - feature: service(), - ghostPaths: service(), - notifications: service(), session: service(), settings: service(), - importErrors: null, - importSuccessful: false, - showDeleteAllModal: false, - submitting: false, - uploadButtonText: 'Import', - - importMimeType: null, - jsonExtension: null, - jsonMimeType: null, - yamlExtension: null, - yamlMimeType: null, - - yamlAccept: null, - - blogDomain: computed('config.blogDomain', function () { - let blogDomain = this.config.blogDomain || ''; - const domainExp = blogDomain.replace('https://', '').replace('http://', '').match(new RegExp('^([^/:?#]+)(?:[/:?#]|$)', 'i')); - return (domainExp && domainExp[1]) || ''; - }), - actions: { setDefaultContentVisibility(value) { this.set('settings.defaultContentVisibility', value); From 7c1e8366be26d97975817774a39b295e6f0a3fc4 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 17:08:54 +0100 Subject: [PATCH 0127/3032] Moved payment settings access control to route no issue - having owner-only access control in the template meant the route was accessible but would show a blank page - updated access control in the `members-payments` route to redirect admins to the settings index screen and non-admins to the default home screen --- app/controllers/settings/members-payments.js | 1 - app/routes/settings/members-payments.js | 13 ++++++++----- app/templates/settings/members-payments.hbs | 5 ----- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/controllers/settings/members-payments.js b/app/controllers/settings/members-payments.js index a0cc6295ca..cf6c9fcc15 100644 --- a/app/controllers/settings/members-payments.js +++ b/app/controllers/settings/members-payments.js @@ -4,7 +4,6 @@ import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency'; export default Controller.extend({ - session: service(), settings: service(), actions: { diff --git a/app/routes/settings/members-payments.js b/app/routes/settings/members-payments.js index f9579bae4b..117431f662 100644 --- a/app/routes/settings/members-payments.js +++ b/app/routes/settings/members-payments.js @@ -1,8 +1,7 @@ import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; -import CurrentUserSettings from 'ghost-admin/mixins/current-user-settings'; import {inject as service} from '@ember/service'; -export default AuthenticatedRoute.extend(CurrentUserSettings, { +export default AuthenticatedRoute.extend({ settings: service(), notifications: service(), queryParams: { @@ -16,9 +15,13 @@ export default AuthenticatedRoute.extend(CurrentUserSettings, { beforeModel() { this._super(...arguments); - return this.get('session.user') - .then(this.transitionAuthor()) - .then(this.transitionEditor()); + return this.get('session.user').then((user) => { + if (!user.isOwner && user.isAdmin) { + return this.transitionTo('settings'); + } else if (!user.isOwner) { + return this.transitionTo('home'); + } + }); }, model() { diff --git a/app/templates/settings/members-payments.hbs b/app/templates/settings/members-payments.hbs index 520169ea16..d3cb3871f7 100644 --- a/app/templates/settings/members-payments.hbs +++ b/app/templates/settings/members-payments.hbs @@ -17,16 +17,11 @@
    - - {{#if this.session.user.isOwner}}
    - - {{/if}} -
    \ No newline at end of file From 2578efa35ac3bd9f809120b81ccbcd42ab164474 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 17:23:20 +0100 Subject: [PATCH 0128/3032] Removed unused code from members-payments route no issue - unused code was left over from settings re-jig copy and paste --- app/routes/settings/members-payments.js | 26 ++----------------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/app/routes/settings/members-payments.js b/app/routes/settings/members-payments.js index 117431f662..777e471400 100644 --- a/app/routes/settings/members-payments.js +++ b/app/routes/settings/members-payments.js @@ -2,20 +2,12 @@ import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; import {inject as service} from '@ember/service'; export default AuthenticatedRoute.extend({ + session: service(), settings: service(), - notifications: service(), - queryParams: { - fromAddressUpdate: { - replace: true - }, - supportAddressUpdate: { - replace: true - } - }, beforeModel() { this._super(...arguments); - return this.get('session.user').then((user) => { + return this.session.get('user').then((user) => { if (!user.isOwner && user.isAdmin) { return this.transitionTo('settings'); } else if (!user.isOwner) { @@ -28,20 +20,6 @@ export default AuthenticatedRoute.extend({ return this.settings.reload(); }, - setupController(controller) { - if (controller.fromAddressUpdate === 'success') { - this.notifications.showAlert( - `Newsletter email address has been updated`.htmlSafe(), - {type: 'success', key: 'members.settings.from-address.updated'} - ); - } else if (controller.supportAddressUpdate === 'success') { - this.notifications.showAlert( - `Support email address has been updated`.htmlSafe(), - {type: 'success', key: 'members.settings.support-address.updated'} - ); - } - }, - resetController(controller, isExiting) { if (isExiting) { controller.reset(); From 72936e1f664e4dc21697e5e5bdf1dc8e5071433a Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 17:25:30 +0100 Subject: [PATCH 0129/3032] Refactored members-payments controller to native class style no issue - refactored to use more modern Ember style native classes, no functionality change --- app/controllers/settings/members-payments.js | 32 ++++++++++---------- app/templates/settings/members-payments.hbs | 4 +-- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/controllers/settings/members-payments.js b/app/controllers/settings/members-payments.js index cf6c9fcc15..45dd5a0561 100644 --- a/app/controllers/settings/members-payments.js +++ b/app/controllers/settings/members-payments.js @@ -1,30 +1,30 @@ /* eslint-disable ghost/ember/alias-model-in-controller */ import Controller from '@ember/controller'; +import {action} from '@ember/object'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency'; -export default Controller.extend({ - settings: service(), +export default class MembersPaymentsController extends Controller { + @service settings; - actions: { - setDefaultContentVisibility(value) { - this.set('settings.defaultContentVisibility', value); - }, + @action + setDefaultContentVisibility(value) { + this.settings.set('defaultContentVisibility', value); + } - setStripeConnectIntegrationTokenSetting(stripeConnectIntegrationToken) { - this.set('settings.stripeConnectIntegrationToken', stripeConnectIntegrationToken); - } - }, + @action + setStripeConnectIntegrationTokenSetting(stripeConnectIntegrationToken) { + this.settings.set('stripeConnectIntegrationToken', stripeConnectIntegrationToken); + } - saveSettings: task(function* () { - const response = yield this.settings.save(); - // Reset from address value on save - return response; - }).drop(), + @task({drop: true}) + *saveSettings() { + return yield this.settings.save(); + } reset() { // stripeConnectIntegrationToken is not a persisted value so we don't want // to keep it around across transitions this.settings.set('stripeConnectIntegrationToken', undefined); } -}); +} diff --git a/app/templates/settings/members-payments.hbs b/app/templates/settings/members-payments.hbs index d3cb3871f7..632275bc45 100644 --- a/app/templates/settings/members-payments.hbs +++ b/app/templates/settings/members-payments.hbs @@ -19,8 +19,8 @@
    From 8030651f9970b0261d45034e91eaedfbc0b91ad0 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 20 Apr 2021 17:41:21 +0100 Subject: [PATCH 0130/3032] Added unsaved changes modal to members-payments screen no issue Unsaved changes handling hadn't been moved across fully to the payments screen when settings were re-jigged meaning changes on the payments screen would make settings dirty and show unsaved changes modal unexpectedly on other screens. - refactored `members-payments` route to use native classes - used same unsaved changes pattern as `members-access` route/controller --- app/controllers/settings/members-payments.js | 26 +++++++++++++++++++- app/routes/settings/members-payments.js | 23 +++++++++++------ app/templates/settings/members-payments.hbs | 9 +++++++ 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/app/controllers/settings/members-payments.js b/app/controllers/settings/members-payments.js index 45dd5a0561..f8fcad5fde 100644 --- a/app/controllers/settings/members-payments.js +++ b/app/controllers/settings/members-payments.js @@ -2,11 +2,14 @@ import Controller from '@ember/controller'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; -import {task} from 'ember-concurrency'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; export default class MembersPaymentsController extends Controller { @service settings; + @tracked showLeaveSettingsModal = false; + @action setDefaultContentVisibility(value) { this.settings.set('defaultContentVisibility', value); @@ -22,6 +25,27 @@ export default class MembersPaymentsController extends Controller { return yield this.settings.save(); } + leaveRoute(transition) { + if (this.settings.get('hasDirtyAttributes')) { + transition.abort(); + this.leaveSettingsTransition = transition; + this.showLeaveSettingsModal = true; + } + } + + @action + async confirmLeave() { + this.settings.rollbackAttributes(); + this.showLeaveSettingsModal = false; + this.leaveSettingsTransition.retry(); + } + + @action + cancelLeave() { + this.showLeaveSettingsModal = false; + this.leaveSettingsTransition = null; + } + reset() { // stripeConnectIntegrationToken is not a persisted value so we don't want // to keep it around across transitions diff --git a/app/routes/settings/members-payments.js b/app/routes/settings/members-payments.js index 777e471400..3f254e7a96 100644 --- a/app/routes/settings/members-payments.js +++ b/app/routes/settings/members-payments.js @@ -1,12 +1,13 @@ import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; import {inject as service} from '@ember/service'; -export default AuthenticatedRoute.extend({ - session: service(), - settings: service(), +export default class MembersPaymentsRoute extends AuthenticatedRoute { + @service session; + @service settings; beforeModel() { - this._super(...arguments); + super.beforeModel(...arguments); + return this.session.get('user').then((user) => { if (!user.isOwner && user.isAdmin) { return this.transitionTo('settings'); @@ -14,21 +15,27 @@ export default AuthenticatedRoute.extend({ return this.transitionTo('home'); } }); - }, + } model() { return this.settings.reload(); - }, + } + + actions = { + willTransition(transition) { + return this.controller.leaveRoute(transition); + } + } resetController(controller, isExiting) { if (isExiting) { controller.reset(); } - }, + } buildRouteInfoMetadata() { return { titleToken: 'Settings - Members' }; } -}); +} diff --git a/app/templates/settings/members-payments.hbs b/app/templates/settings/members-payments.hbs index 632275bc45..caa55e76a0 100644 --- a/app/templates/settings/members-payments.hbs +++ b/app/templates/settings/members-payments.hbs @@ -24,4 +24,13 @@ /> + + {{#if this.showLeaveSettingsModal}} + + {{/if}} \ No newline at end of file From 3867c9b6ad207a20d6c07d292596b9cc0b7c4057 Mon Sep 17 00:00:00 2001 From: Thibaut Patel Date: Tue, 20 Apr 2021 19:15:33 +0200 Subject: [PATCH 0131/3032] Added an upgrade modal to the custom theme activation failure scenario no issue - The modal only appears when the user hits a limitation trying to activate a custom theme not part of the allowlist (if the custom theme allowlist is configured) - Changed the upgrade button to green to match the design --- .../modal-upgrade-host-limit-custom-theme.hbs | 2 +- app/controllers/settings/theme.js | 13 ++++++++++++- app/services/limit.js | 4 ++++ app/templates/settings/theme.hbs | 8 +++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/components/modal-upgrade-host-limit-custom-theme.hbs b/app/components/modal-upgrade-host-limit-custom-theme.hbs index b0f1497819..e8d3e26f22 100644 --- a/app/components/modal-upgrade-host-limit-custom-theme.hbs +++ b/app/components/modal-upgrade-host-limit-custom-theme.hbs @@ -15,7 +15,7 @@ Cancel - \ No newline at end of file diff --git a/app/controllers/settings/theme.js b/app/controllers/settings/theme.js index 77ef0f31a9..f387cf38b2 100644 --- a/app/controllers/settings/theme.js +++ b/app/controllers/settings/theme.js @@ -44,6 +44,7 @@ export const MARKETPLACE_THEMES = [{ export default Controller.extend({ config: service(), ghostPaths: service(), + limit: service(), notifications: service(), session: service(), settings: service(), @@ -53,6 +54,7 @@ export default Controller.extend({ newSecondaryNavItem: null, themes: null, themeToDelete: null, + displayUpgradeModal: false, init() { this._super(...arguments); @@ -68,7 +70,12 @@ export default Controller.extend({ }), actions: { - activateTheme(theme) { + async activateTheme(theme) { + const isOverLimit = await this.limit.checkWouldGoOverLimit('customThemes', {value: theme.name}); + if (isOverLimit) { + this.set('displayUpgradeModal', true); + return; + } return theme.activate().then((activatedTheme) => { if (!isEmpty(activatedTheme.get('warnings'))) { this.set('themeWarnings', activatedTheme.get('warnings')); @@ -138,6 +145,10 @@ export default Controller.extend({ this.set('showThemeErrorsModal', false); }, + hideUpgradeModal() { + this.set('displayUpgradeModal', false); + }, + reset() {} }, diff --git a/app/services/limit.js b/app/services/limit.js index c6f3cf139b..1403e2a6e4 100644 --- a/app/services/limit.js +++ b/app/services/limit.js @@ -59,6 +59,10 @@ export default class LimitsService extends Service { }); } + async checkWouldGoOverLimit(limitName, metadata = {}) { + return this.limiter.checkWouldGoOverLimit(limitName, metadata); + } + decorateWithCountQueries(limits) { if (limits.staff) { limits.staff.currentCountQuery = bind(this, this.getStaffUsersCount); diff --git a/app/templates/settings/theme.hbs b/app/templates/settings/theme.hbs index 8d4195253e..db6c5309f8 100644 --- a/app/templates/settings/theme.hbs +++ b/app/templates/settings/theme.hbs @@ -100,4 +100,10 @@ -{{outlet}} \ No newline at end of file +{{outlet}} + +{{#if this.displayUpgradeModal}} + +{{/if}} From 09020e8fd04a8c32e3142406fb7343f98a61e93e Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Wed, 21 Apr 2021 09:10:21 +0100 Subject: [PATCH 0132/3032] v4.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e4dd2b24d..29d8084301 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.2.2", + "version": "4.3.0", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From ca76293b05fbe492c312767de620238e79752ca8 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Wed, 21 Apr 2021 12:22:02 +0200 Subject: [PATCH 0133/3032] Fixed marketplace link in theme settings --- app/templates/settings/theme.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/settings/theme.hbs b/app/templates/settings/theme.hbs index db6c5309f8..8aa7332bc8 100644 --- a/app/templates/settings/theme.hbs +++ b/app/templates/settings/theme.hbs @@ -17,7 +17,7 @@
    From 75e24825c9fbdb34b3425f2e1340902929453868 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 21 Apr 2021 12:09:40 +0100 Subject: [PATCH 0134/3032] =?UTF-8?q?=E2=9C=A8=20Added=20option=20to=20dis?= =?UTF-8?q?able=20member=20subscriptions=20(#1925)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Team/issues/579 - new Access settings screen that moves subscription access and default post visibility from the Payments settings screen - expanded "Free signup" toggle into three signup access options - "anyone" - same as previous "allow free member signup" option set to `true` - "invite only" - same as previous "allow free member signup" option set to `false` - "nobody" - completely disables member signup and login. Removes injected portal and stripe scripts on the front-end and hides member related sections on the admin dashboard (this commit moves the above changes out from behind the developer experiments flag and cleans up now-unused code) --- .../gh-launch-wizard/set-pricing.hbs | 2 +- .../gh-launch-wizard/set-pricing.js | 2 +- .../gh-members-payments-setting.hbs | 64 ------------------- app/components/gh-members-payments-setting.js | 20 ------ app/components/modal-portal-settings.js | 4 +- app/models/setting.js | 16 +---- app/templates/settings.hbs | 14 ++-- 7 files changed, 12 insertions(+), 110 deletions(-) diff --git a/app/components/gh-launch-wizard/set-pricing.hbs b/app/components/gh-launch-wizard/set-pricing.hbs index 31da1f55f5..63f4ace1e2 100644 --- a/app/components/gh-launch-wizard/set-pricing.hbs +++ b/app/components/gh-launch-wizard/set-pricing.hbs @@ -66,7 +66,7 @@ checked={{this.isFreeChecked}} id="free-plan" name="free-plan" - disabled={{not this.settings.membersAllowFreeSignup}} + disabled={{not (eq this.settings.membersSignupAccess "all")}} class="gh-input post-settings-featured" {{on "click" this.toggleFreePlan}} data-test-checkbox="featured" diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index cefbb3ee13..b3e33e2843 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -46,7 +46,7 @@ export default class GhLaunchWizardSetPricingComponent extends Component { get isFreeChecked() { const allowedPlans = this.settings.get('portalPlans') || []; - return (this.settings.get('membersAllowFreeSignup') && allowedPlans.includes('free')); + return (this.settings.get('membersSignupAccess') === 'all' && allowedPlans.includes('free')); } get isMonthlyChecked() { diff --git a/app/components/gh-members-payments-setting.hbs b/app/components/gh-members-payments-setting.hbs index 05148fd5e5..b2a57ecc6e 100644 --- a/app/components/gh-members-payments-setting.hbs +++ b/app/components/gh-members-payments-setting.hbs @@ -216,70 +216,6 @@
    -{{#unless (enable-developer-experiments)}} -
    -

    Access

    -
    -
    -
    -
    -

    Allow free member signup

    -

    If disabled, members can only be signed up via payment checkout or API integration

    -
    -
    - -
    -
    -
    - -
    -
    -
    -

    Default post access

    -

    When a new post is created, who should have access to it?

    -
    - -
    -
    - {{#liquid-if this.membersPostAccessOpen}} -
    -
    -
    -
    -
    Public
    - All site visitors to your site, no login required
    -
    -
    - -
    -
    -
    -
    Members only
    - All logged-in members
    -
    -
    - -
    -
    -
    -
    Paid-members only
    - Only logged-in members with an active Stripe subscription
    -
    -
    -
    - {{/liquid-if}} -
    -
    -
    -
    -{{/unless}} - {{#if this.showDisconnectStripeConnectModal}} plan.interval === 'month'); @@ -103,14 +91,6 @@ export default Component.extend({ }, actions: { - setDefaultContentVisibility(value) { - this.setDefaultContentVisibility(value); - }, - - toggleSelfSignup() { - this.set('settings.membersAllowFreeSignup', !this.get('allowSelfSignup')); - }, - setStripeDirectPublicKey(event) { this.set('settings.stripeProductName', this.get('settings.title')); this.set('settings.stripePublishableKey', event.target.value); diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index 2045d125d7..fd511bb9ca 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -1,8 +1,8 @@ import $ from 'jquery'; import ModalComponent from 'ghost-admin/components/modal-base'; import copyTextToClipboard from 'ghost-admin/utils/copy-text-to-clipboard'; -import {alias, reads} from '@ember/object/computed'; import {computed} from '@ember/object'; +import {equal, reads} from '@ember/object/computed'; import {htmlSafe} from '@ember/string'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; @@ -49,7 +49,7 @@ export default ModalComponent.extend({ confirm() {}, - allowSelfSignup: alias('settings.membersAllowFreeSignup'), + allowSelfSignup: equal('settings.membersSignupAccess', 'all'), isStripeConfigured: reads('membersUtils.isStripeEnabled'), diff --git a/app/models/setting.js b/app/models/setting.js index bdeb135c15..1145b5b675 100644 --- a/app/models/setting.js +++ b/app/models/setting.js @@ -1,7 +1,6 @@ /* eslint-disable camelcase */ import Model, {attr} from '@ember-data/model'; import ValidationEngine from 'ghost-admin/mixins/validation-engine'; -import {computed} from '@ember/object'; export default Model.extend(ValidationEngine, { validationType: 'setting', @@ -75,18 +74,5 @@ export default Model.extend(ValidationEngine, { newsletterShowHeader: attr('boolean'), newsletterBodyFontCategory: attr('string'), newsletterShowBadge: attr('boolean'), - newsletterFooterContent: attr('string'), - - // TODO: remove when Access screen with "Nobody" option is out of dev experiments - membersAllowFreeSignup: computed('membersSignupAccess', { - get() { - const signupAccess = this.membersSignupAccess; - return signupAccess === 'all' ? true : false; - }, - set(key, allowFreeSignup) { - const signupAccess = allowFreeSignup ? 'all' : 'invite'; - this.set('membersSignupAccess', signupAccess); - return allowFreeSignup; - } - }) + newsletterFooterContent: attr('string') }); diff --git a/app/templates/settings.hbs b/app/templates/settings.hbs index 1d255dcdbd..46fb479c43 100644 --- a/app/templates/settings.hbs +++ b/app/templates/settings.hbs @@ -40,14 +40,14 @@
    Members
    + + {{svg-jar "eye"}} +
    +

    Access

    +

    Configure members usage and default access levels

    +
    +
    {{#if (enable-developer-experiments)}} - - {{svg-jar "eye"}} -
    -

    Access

    -

    Configure members usage and default access levels

    -
    -
    {{svg-jar "module"}}
    From 600eb72ab6a04e465890faea39a79ab12ec15f3a Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Thu, 22 Apr 2021 09:59:48 +0200 Subject: [PATCH 0135/3032] Fixed spacing bug in AMP settings --- app/templates/integrations/amp.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/integrations/amp.hbs b/app/templates/integrations/amp.hbs index e7b353c71d..b110c55bc3 100644 --- a/app/templates/integrations/amp.hbs +++ b/app/templates/integrations/amp.hbs @@ -60,7 +60,7 @@
    Google Analytics Tracking ID
    -
    Tracks AMP traffic in Google Analytics, find your ID here
    +
    Tracks AMP traffic in Google Analytics, find your ID here
    Date: Thu, 22 Apr 2021 09:48:44 +0100 Subject: [PATCH 0136/3032] v4.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 29d8084301..3eaebb19a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.3.0", + "version": "4.3.1", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 02aeab94f761eb45a2e6b919e3e8f2e1e9e204ee Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Thu, 22 Apr 2021 14:43:57 +0200 Subject: [PATCH 0137/3032] Fixed icons alignment in post preview --- app/styles/components/publishmenu.css | 2 +- app/styles/layouts/post-preview.css | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/styles/components/publishmenu.css b/app/styles/components/publishmenu.css index 520ec2e05a..1122ee83ff 100644 --- a/app/styles/components/publishmenu.css +++ b/app/styles/components/publishmenu.css @@ -12,7 +12,7 @@ .gh-publishmenu-trigger svg path { stroke: var(--darkgrey); - stroke-width: 4px; + stroke-width: 2px; } .gh-publishmenu-trigger:focus { diff --git a/app/styles/layouts/post-preview.css b/app/styles/layouts/post-preview.css index 715208a1b0..f6f35bc75d 100644 --- a/app/styles/layouts/post-preview.css +++ b/app/styles/layouts/post-preview.css @@ -10,7 +10,7 @@ min-height: 72px; overflow: hidden; margin: 0; - padding: 18px 32px; + padding: 18px 32px 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; background: var(--white); @@ -39,8 +39,9 @@ width: 64px; } -.gh-post-preview-btn-group button span { - height: 40px; +.gh-post-preview-btn-group .gh-btn-group span { + height: 36px; + line-height: 34px; border-radius: 3px; } From 87e700fe355b8acb5a2425aa465654baf51d24e3 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Thu, 22 Apr 2021 17:32:38 +0100 Subject: [PATCH 0138/3032] v4.3.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3eaebb19a8..60baba282f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.3.1", + "version": "4.3.2", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From bea9940a747439a0521968e0aae34cb2301be23c Mon Sep 17 00:00:00 2001 From: Rishabh Garg Date: Thu, 22 Apr 2021 22:17:19 +0530 Subject: [PATCH 0139/3032] Wired products data to Product settings screen (#1927) refs https://github.com/TryGhost/Team/issues/627 Wires the real Products data from API to the mock Product settings screen including Product Prices list as well as opening of edit/new price modals. The new Product setting is still behind the developer experiment flag as is under active development, the changes in this commit only allows readonly data but not save/edit upstream. Co-authored-by: Fabien O'Carroll --- .../gh-products-price-billingperiod.hbs | 4 +- .../gh-products-price-billingperiod.js | 27 ++++-- app/components/modal-product-price.hbs | 11 +-- app/components/modal-product-price.js | 55 +++++++++++- app/controllers/settings/product.js | 31 +++++++ app/controllers/settings/products.js | 6 +- app/helpers/currency-symbol.js | 11 +++ app/models/product.js | 10 +++ app/models/stripe-price.js | 12 +++ app/router.js | 3 +- app/routes/settings/product.js | 10 ++- app/routes/settings/product/new.js | 6 ++ app/routes/settings/products.js | 7 ++ app/templates/settings/product.hbs | 89 ++++++------------- app/templates/settings/products.hbs | 12 +-- app/transforms/stripe-price.js | 19 ++++ 16 files changed, 226 insertions(+), 87 deletions(-) create mode 100644 app/helpers/currency-symbol.js create mode 100644 app/models/product.js create mode 100644 app/models/stripe-price.js create mode 100644 app/routes/settings/product/new.js create mode 100644 app/transforms/stripe-price.js diff --git a/app/components/gh-products-price-billingperiod.hbs b/app/components/gh-products-price-billingperiod.hbs index 0b2ded9911..c9811c9bab 100644 --- a/app/components/gh-products-price-billingperiod.hbs +++ b/app/components/gh-products-price-billingperiod.hbs @@ -1,5 +1,7 @@ - -

    New price

    +

    {{this.title}}

    - - - -
  • + {{#each this.stripePrices as |price|}} +
  • - Yearly + {{price.nickname}}

    - 37% discount + TODO: Description

    - $50 USD / year + {{currency-symbol price.currency}}{{price.amount}} / {{price.interval}}
    - 76 + TODO
    - Edit - -
    -
    -
  • -
  • -
    -

    - Complimentary Archived -

    -

    - Free of charge subscription -

    -
    - -
    - $0 USD -
    - -
    - 18 -
    - -
    -
    - + + {{#if price.active}} + + {{else}} + + {{/if}}
  • + {{/each}} - {{#if this.showPriceModal}} - {{/if}} diff --git a/app/templates/settings/products.hbs b/app/templates/settings/products.hbs index e24ee24347..8555c32a48 100644 --- a/app/templates/settings/products.hbs +++ b/app/templates/settings/products.hbs @@ -6,7 +6,7 @@ Products
    - New product + New product
    @@ -17,23 +17,25 @@
    + {{#each this.products as |product|}}
  • - +

    - Product name + {{product.name}}

    - Product description + TODO: Product description

    - +
    {{!-- 330 members --}} {{svg-jar "arrow-right" class="w6 h6 fill-midgrey pa1"}}
  • + {{/each}} diff --git a/app/transforms/stripe-price.js b/app/transforms/stripe-price.js new file mode 100644 index 0000000000..fee1872699 --- /dev/null +++ b/app/transforms/stripe-price.js @@ -0,0 +1,19 @@ +import StripePrice from 'ghost-admin/models/stripe-price'; +import Transform from '@ember-data/serializer/transform'; +import {A as emberA, isArray as isEmberArray} from '@ember/array'; + +export default Transform.extend({ + deserialize(serialized = []) { + return emberA(serialized.map(StripePrice.create.bind(StripePrice))); + }, + + serialize(deserialized) { + if (isEmberArray(deserialized)) { + return deserialized.map((item) => { + return item; + }).compact(); + } else { + return []; + } + } +}); From 135afd8b96c72245e66afa5cce2c54b0deab9e33 Mon Sep 17 00:00:00 2001 From: Thibaut Patel Date: Thu, 22 Apr 2021 19:41:41 +0200 Subject: [PATCH 0140/3032] Added UI for setting OAuth settings issue https://github.com/TryGhost/Team/issues/614 --- app/controllers/settings/labs.js | 22 ++++++++++++ app/models/setting.js | 7 +++- app/services/settings.js | 2 +- app/templates/settings/labs.hbs | 58 ++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 2 deletions(-) diff --git a/app/controllers/settings/labs.js b/app/controllers/settings/labs.js index 3b429584b1..2525bf9d8a 100644 --- a/app/controllers/settings/labs.js +++ b/app/controllers/settings/labs.js @@ -8,6 +8,7 @@ import { isRequestEntityTooLargeError, isUnsupportedMediaTypeError } from 'ghost-admin/services/ajax'; +import {computed, set} from '@ember/object'; import {isBlank} from '@ember/utils'; import {isArray as isEmberArray} from '@ember/array'; import {run} from '@ember/runloop'; @@ -56,6 +57,8 @@ export default Controller.extend({ yamlAccept: null, + isOAuthConfigurationOpen: false, + init() { this._super(...arguments); this.importMimeType = IMPORT_MIME_TYPES; @@ -69,6 +72,10 @@ export default Controller.extend({ this.yamlAccept = [...this.yamlMimeType, ...Array.from(this.yamlExtension, extension => '.' + extension)]; }, + isOAuthEnabled: computed('settings.{oauthClientId,oauthClientSecret}', 'isOAuthConfigurationOpen', function () { + return (this.settings.get('oauthClientId') && this.settings.get('oauthClientSecret')) || this.isOAuthConfigurationOpen; + }), + actions: { onUpload(file) { let formData = new FormData(); @@ -145,10 +152,25 @@ export default Controller.extend({ iframe.attr('src', downloadURL); }, + async saveOAuthSettings() { + await this.settings.save(); + }, + toggleDeleteAllModal() { this.toggleProperty('showDeleteAllModal'); }, + async toggleIsOAuthEnabled() { + if (this.isOAuthEnabled) { + this.settings.set('oauthClientId', ''); + this.settings.set('oauthClientSecret', ''); + set(this, 'isOAuthConfigurationOpen', false); + await this.settings.save(); + } else { + set(this, 'isOAuthConfigurationOpen', true); + } + }, + /** * Opens a file selection dialog - Triggered by "Upload x" buttons, * searches for the hidden file input within the .gh-setting element diff --git a/app/models/setting.js b/app/models/setting.js index 1145b5b675..86f3b98584 100644 --- a/app/models/setting.js +++ b/app/models/setting.js @@ -74,5 +74,10 @@ export default Model.extend(ValidationEngine, { newsletterShowHeader: attr('boolean'), newsletterBodyFontCategory: attr('string'), newsletterShowBadge: attr('boolean'), - newsletterFooterContent: attr('string') + newsletterFooterContent: attr('string'), + /** + * OAuth settings + */ + oauthClientId: attr('string'), + oauthClientSecret: attr('string') }); diff --git a/app/services/settings.js b/app/services/settings.js index c336c7fb4f..1028652b02 100644 --- a/app/services/settings.js +++ b/app/services/settings.js @@ -27,7 +27,7 @@ export default Service.extend(_ProxyMixin, ValidationEngine, { _loadSettings() { if (!this._loadingPromise) { this._loadingPromise = this.store - .queryRecord('setting', {group: 'site,theme,private,members,portal,newsletter,email,amp,labs,slack,unsplash,views,firstpromoter'}) + .queryRecord('setting', {group: 'site,theme,private,members,portal,newsletter,email,amp,labs,slack,unsplash,views,firstpromoter,oauth'}) .then((settings) => { this._loadingPromise = null; return settings; diff --git a/app/templates/settings/labs.hbs b/app/templates/settings/labs.hbs index d5725f99b3..c0213e3f10 100644 --- a/app/templates/settings/labs.hbs +++ b/app/templates/settings/labs.hbs @@ -179,6 +179,64 @@ + + {{#if (enable-developer-experiments)}} +
    +
    +
    +
    +

    Enable Google OAuth authentication

    +

    + Allow your staff users to sign in to Ghost with Google Single Sign-On +

    +
    +
    + +
    +
    +
    + {{#if this.isOAuthEnabled}} +
    + + To get started, you first have to set up Ghost to allow login and registration with Google OAuth2. Read our + {{!-- TODO: create an help desk article and update the url here --}} + setup guide here + + + + + + + + + +
    + {{/if}} +
    +
    +
    + {{/if}} From e6a4cf5a716f1bc634b5989d389afc8006b1bf37 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 23 Apr 2021 10:00:10 +0100 Subject: [PATCH 0141/3032] Tweaked wording of members access options refs https://github.com/TryGhost/Team/issues/579 "Only people I invite" did not marry with behaviour. When selected it matches the old "Allow free member signup = false" toggle setting which only disables free member signup rather than disabling all front-end signup --- app/templates/settings/members-access.hbs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/templates/settings/members-access.hbs b/app/templates/settings/members-access.hbs index 9c9bf6d6c5..7ddbce9128 100644 --- a/app/templates/settings/members-access.hbs +++ b/app/templates/settings/members-access.hbs @@ -48,7 +48,8 @@
    Only people I invite
    -
    People can sign in from your site but won't be able to sign up
    +
    No free sign up
    +
    Visitors can only subscribe by paying or being invited, anyone can sign in.
    From 0288bd06925cf0ba59a85249bf2addb4defecb2f Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Fri, 23 Apr 2021 15:06:46 +0200 Subject: [PATCH 0142/3032] Fixed theme install modal height bug --- app/styles/layouts/settings.css | 1 - 1 file changed, 1 deletion(-) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 7d3cb30325..5a8df9a670 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -955,7 +955,6 @@ /*Errors */ .theme-validation-container { - max-height: calc(100vh - 12vw - 110px); overflow-y: auto; margin: -32px -32px 0; padding: 32px 32px 0; From 553bdcac3c1fd69e7c718841130c9f3d167d89f6 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Fri, 23 Apr 2021 15:29:26 +0200 Subject: [PATCH 0143/3032] Fixed spacing issue in Firstpromoter settings --- app/templates/integrations/firstpromoter.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/integrations/firstpromoter.hbs b/app/templates/integrations/firstpromoter.hbs index 616455b4fa..f02f9aff19 100644 --- a/app/templates/integrations/firstpromoter.hbs +++ b/app/templates/integrations/firstpromoter.hbs @@ -60,7 +60,7 @@
    FirstPromoter Account ID
    -
    Affiliate and referral tracking, find your ID here
    +
    Affiliate and referral tracking, find your ID here
    Date: Fri, 23 Apr 2021 11:20:18 +0000 Subject: [PATCH 0144/3032] Update dependency grunt to v1.4.0 --- package.json | 2 +- yarn.lock | 126 +++++++++++++++++++++++++-------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 60baba282f..9de6ddc0b4 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "fs-extra": "9.1.0", "glob": "7.1.6", "google-caja-bower": "https://github.com/acburdine/google-caja-bower#ghost", - "grunt": "1.3.0", + "grunt": "1.4.0", "grunt-shell": "3.0.1", "keymaster": "https://github.com/madrobby/keymaster.git", "liquid-fire": "0.31.0", diff --git a/yarn.lock b/yarn.lock index 9e14121543..7a3354f68a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2673,10 +2673,10 @@ async@~0.2.9: resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= -async@~1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= +async@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== asynckit@^0.4.0: version "0.4.0" @@ -7996,7 +7996,7 @@ exists-sync@0.0.4: resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" integrity sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk= -exit@^0.1.2, exit@~0.1.1, exit@~0.1.2: +exit@^0.1.2, exit@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= @@ -8072,7 +8072,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -8389,7 +8389,7 @@ findup-sync@~0.3.0: dependencies: glob "~5.0.0" -fined@^1.0.1: +fined@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== @@ -8451,7 +8451,7 @@ fixturify@^2.1.0: matcher-collection "^2.0.1" walk-sync "^2.0.2" -flagged-respawn@^1.0.0: +flagged-respawn@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== @@ -8785,10 +8785,10 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getobject@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c" - integrity sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw= +getobject@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/getobject/-/getobject-1.0.0.tgz#27eeb6394716cfb6adcef275a33c2752df9ca49a" + integrity sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag== getpass@^0.1.1: version "0.1.7" @@ -8965,18 +8965,18 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -grunt-cli@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.3.2.tgz#60f12d12c1b5aae94ae3469c6b5fe24e960014e8" - integrity sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ== +grunt-cli@~1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.2.tgz#8a83dcc89ebd92d278ccd6014105011cffc71165" + integrity sha512-wsu6BZh7KCnfeaSkDrKIAvOlqGKxNRTZjc8xfZlvxCByQIqUfZ31kh5uHpPnhQ4NdVgvaWaVxa1LUbVU80nACw== dependencies: - grunt-known-options "~1.1.0" + grunt-known-options "~1.1.1" interpret "~1.1.0" - liftoff "~2.5.0" + liftup "~3.0.1" nopt "~4.0.1" - v8flags "~3.1.1" + v8flags "~3.2.0" -grunt-known-options@~1.1.0: +grunt-known-options@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d" integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ== @@ -8999,18 +8999,18 @@ grunt-legacy-log@~3.0.0: hooker "~0.2.3" lodash "~4.17.19" -grunt-legacy-util@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz#34d20f2a26c6adebfe9a9bdc8823f7016b0369c3" - integrity sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA== +grunt-legacy-util@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz#0f929d13a2faf9988c9917c82bff609e2d9ba255" + integrity sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w== dependencies: - async "~1.5.2" - exit "~0.1.1" - getobject "~0.1.0" + async "~3.2.0" + exit "~0.1.2" + getobject "~1.0.0" hooker "~0.2.3" - lodash "~4.17.20" + lodash "~4.17.21" underscore.string "~3.3.5" - which "~1.3.0" + which "~2.0.2" grunt-shell@3.0.1: version "3.0.1" @@ -9021,20 +9021,20 @@ grunt-shell@3.0.1: npm-run-path "^2.0.0" strip-ansi "^5.0.0" -grunt@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.3.0.tgz#55db6ccd80c6fb53722e496f680620a2e681f809" - integrity sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA== +grunt@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.4.0.tgz#235219cf922cf5f249809d60722442bb8247eff7" + integrity sha512-yRFc0GVCDu9yxqOFzpuXQ2pEdgtLDnFv5Qz54jfIcNnpJ8Z7B7P7kPkT4VMuRvm+N+QOsI8C4v/Q0DSaoj3LgQ== dependencies: dateformat "~3.0.3" eventemitter2 "~0.4.13" exit "~0.1.2" findup-sync "~0.3.0" glob "~7.1.6" - grunt-cli "~1.3.2" - grunt-known-options "~1.1.0" + grunt-cli "~1.4.2" + grunt-known-options "~1.1.1" grunt-legacy-log "~3.0.0" - grunt-legacy-util "~2.0.0" + grunt-legacy-util "~2.0.1" iconv-lite "~0.4.13" js-yaml "~3.14.0" minimatch "~3.0.4" @@ -10312,19 +10312,19 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -liftoff@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" - integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= +liftup@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/liftup/-/liftup-3.0.1.tgz#1cb81aff0f368464ed3a5f1a7286372d6b1a60ce" + integrity sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw== dependencies: - extend "^3.0.0" - findup-sync "^2.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" + extend "^3.0.2" + findup-sync "^4.0.0" + fined "^1.2.0" + flagged-respawn "^1.0.1" is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" + object.map "^1.0.1" + rechoir "^0.7.0" + resolve "^1.19.0" line-column@^1.0.2: version "1.0.2" @@ -10737,12 +10737,12 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.11.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.5.1, lodash@~4.17.19, lodash@~4.17.20: +lodash@^4.11.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.5.1, lodash@~4.17.19: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.21: +lodash@^4.17.21, lodash@~4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11694,7 +11694,7 @@ object.getownpropertydescriptors@^2.1.0: define-properties "^1.1.3" es-abstract "^1.18.0-next.1" -object.map@^1.0.0: +object.map@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= @@ -12830,12 +12830,12 @@ recast@^0.18.1: private "^0.1.8" source-map "~0.6.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= +rechoir@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== dependencies: - resolve "^1.1.6" + resolve "^1.9.0" redeyed@~1.0.0: version "1.0.1" @@ -13112,7 +13112,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== @@ -13120,7 +13120,7 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.12. is-core-module "^2.1.0" path-parse "^1.0.6" -resolve@^1.10.1, resolve@^1.14.2: +resolve@^1.10.1, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.9.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -14837,10 +14837,10 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== -v8flags@~3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" - integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== +v8flags@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" + integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== dependencies: homedir-polyfill "^1.0.1" @@ -15107,14 +15107,14 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which@^1.2.14, which@^1.2.9, which@^1.3.0, which@~1.3.0: +which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^2.0.1: +which@^2.0.1, which@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== From 374f5c17bf879e39ce69216023458448ce4fcc59 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 23 Apr 2021 23:35:45 +0000 Subject: [PATCH 0145/3032] Update dependency eslint to v7.25.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9de6ddc0b4..f517943b2e 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "ember-truth-helpers": "3.0.0", "ember-useragent": "0.10.0", "emberx-file-input": "1.2.1", - "eslint": "7.24.0", + "eslint": "7.25.0", "eslint-plugin-ghost": "2.0.0", "faker": "5.5.3", "fs-extra": "9.1.0", diff --git a/yarn.lock b/yarn.lock index 7a3354f68a..089cebe549 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7683,10 +7683,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.24.0: - version "7.24.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a" - integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ== +eslint@7.25.0: + version "7.25.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" + integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.4.0" From 52f82a3bd2d2482ea4fad8b27f76353ae335f31b Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 26 Apr 2021 08:17:50 +0100 Subject: [PATCH 0146/3032] Added grouped and custom option support to `` no issue - `` is based around `` but using Power Select's grouped options feature didn't work because we weren't falling back to it's built-in group component - updated the `` template to use a supplied block as the option display rather than only displaying the option's label (allows for counts etc to be shown alongside dropdown options) --- app/components/gh-token-input.hbs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/components/gh-token-input.hbs b/app/components/gh-token-input.hbs index b0e51d34f2..b3d70d1a69 100644 --- a/app/components/gh-token-input.hbs +++ b/app/components/gh-token-input.hbs @@ -16,7 +16,7 @@ @disabled={{@disabled}} @dropdownClass={{@dropdownClass}} @extra={{@extra}} - @groupComponent={{@groupComponent}} + @groupComponent={{or @groupComponent "power-select/power-select-group"}} @horizontalPosition={{@horizontalPosition}} @initiallyOpened={{@initiallyOpened}} @loadingMessage={{@loadingMessage}} @@ -59,6 +59,10 @@ {{#if option.__isSuggestion__}} {{else}} - {{get option this.labelField}} + {{#if (has-block)}} + {{yield option}} + {{else}} + {{get option this.labelField}} + {{/if}} {{/if}} \ No newline at end of file From 4721010b59b74c9d1c4e66586a4fa61514a918c4 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 26 Apr 2021 08:20:51 +0100 Subject: [PATCH 0147/3032] Revert "Tweaked wording of members access options" This reverts commit e6a4cf5a716f1bc634b5989d389afc8006b1bf37. - the previous wording was correct and the behaviour needs to be changed to match rather than following the "allow free member signup" toggle behaviour --- app/templates/settings/members-access.hbs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/templates/settings/members-access.hbs b/app/templates/settings/members-access.hbs index 7ddbce9128..9c9bf6d6c5 100644 --- a/app/templates/settings/members-access.hbs +++ b/app/templates/settings/members-access.hbs @@ -48,8 +48,7 @@
    Only people I invite
    -
    No free sign up
    -
    Visitors can only subscribe by paying or being invited, anyone can sign in.
    +
    People can sign in from your site but won't be able to sign up
    From a4289eb348b9428f7005aa8b453ca0018718d73c Mon Sep 17 00:00:00 2001 From: Fabien 'egg' O'Carroll Date: Mon, 26 Apr 2021 17:28:39 +0100 Subject: [PATCH 0148/3032] Wired up Member details screen to Custom Products refs https://github.com/TryGhost/Team/issues/627 This is the reworked Member detail screen for Custom Products and adds new functionality, or includes existing including: - List Products for a Member, and the associated Subscriptions - Allow cancelling/continuing said Subscriptions - Adding a Product to a Member with a zero-amount Price --- app/components/gh-member-product-prices.hbs | 9 - app/components/gh-member-product-prices.js | 13 -- app/components/gh-member-product-products.hbs | 9 - app/components/gh-member-product-products.js | 13 -- app/components/gh-member-settings-form-cp.hbs | 162 ++++++++-------- app/components/gh-member-settings-form-cp.js | 175 ++++++++++-------- app/components/modal-member-product.hbs | 34 +++- app/components/modal-member-product.js | 91 ++++++++- app/controllers/member.js | 5 +- app/models/member-product.js | 6 + app/models/member.js | 2 + app/routes/member.js | 2 +- app/styles/layouts/members.css | 51 ++++- app/styles/patterns/buttons.css | 2 +- app/transforms/member-product.js | 30 +++ 15 files changed, 376 insertions(+), 228 deletions(-) delete mode 100644 app/components/gh-member-product-prices.hbs delete mode 100644 app/components/gh-member-product-prices.js delete mode 100644 app/components/gh-member-product-products.hbs delete mode 100644 app/components/gh-member-product-products.js create mode 100644 app/models/member-product.js create mode 100644 app/transforms/member-product.js diff --git a/app/components/gh-member-product-prices.hbs b/app/components/gh-member-product-prices.hbs deleted file mode 100644 index 5c87f51a80..0000000000 --- a/app/components/gh-member-product-prices.hbs +++ /dev/null @@ -1,9 +0,0 @@ - - - {{svg-jar "arrow-down-small"}} - \ No newline at end of file diff --git a/app/components/gh-member-product-prices.js b/app/components/gh-member-product-prices.js deleted file mode 100644 index 09b7d62fcb..0000000000 --- a/app/components/gh-member-product-prices.js +++ /dev/null @@ -1,13 +0,0 @@ -import Component from '@ember/component'; - -const PRICES = [ - {label: '$4/month', id: '1'}, - {label: '$40/year', id: '2'} -]; - -export default Component.extend({ - init() { - this._super(...arguments); - this.availablePrices = PRICES; - } -}); \ No newline at end of file diff --git a/app/components/gh-member-product-products.hbs b/app/components/gh-member-product-products.hbs deleted file mode 100644 index 2afb4aa400..0000000000 --- a/app/components/gh-member-product-products.hbs +++ /dev/null @@ -1,9 +0,0 @@ - - - {{svg-jar "arrow-down-small"}} - \ No newline at end of file diff --git a/app/components/gh-member-product-products.js b/app/components/gh-member-product-products.js deleted file mode 100644 index ceefda43e2..0000000000 --- a/app/components/gh-member-product-products.js +++ /dev/null @@ -1,13 +0,0 @@ -import Component from '@ember/component'; - -const PRODUCTS = [ - {label: 'Basic', id: '1'}, - {label: 'Advanced', id: '2'} -]; - -export default Component.extend({ - init() { - this._super(...arguments); - this.availableProducts = PRODUCTS; - } -}); \ No newline at end of file diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index 02cb7a869c..58ba76c13e 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -7,17 +7,22 @@ {{#if (or this.member.name this.member.email)}} {{else}} -
    +
    N
    {{/if}}

    {{or this.member.name this.member.email}} + {{#unless (or this.member.name this.member.email)}} + {{#if this.member.isNew}} + New member + {{/if}} + {{/unless}}

    {{#if (and this.member.name this.member.email)}} @@ -98,7 +103,7 @@

    {{#if this.canShowStripeInfo}} - {{#if this.subscriptions}} + {{#if this.customer}}

    Stripe info

    @@ -108,23 +113,13 @@ Name: - {{#if customer.name}} - {{customer.name}} + {{#if this.customer.name}} + {{this.customer.name}} {{else}} No name {{/if}} - - Email: - - {{#if customer.email}} - {{customer.email}} - {{else}} - No email - {{/if}} - -
    @@ -132,9 +127,13 @@
    - - +
    Card: - **** **** **** 4242 + Email: + {{#if this.customer.email}} + {{this.customer.email}} + {{else}} + No email + {{/if}}
    @@ -155,78 +154,75 @@
    1. -
    2. + {{#unless this.products}}
    3. -
      -

      - Product 1 Active -

      -
      - - - -
      - Created on 9 April 2021 - - View on Stripe - -
      -
      -
      - -
      -
      - Edit - -
      +
      +
      This member doesn't have any products.
      + {{#unless this.member.isNew}} + + {{/unless}}
    4. -
    5. -
      -

      - Product 2 Cancelled -

      -
      - - - -
      - Created on 9 April 2021 - - View on Stripe - -
      -
      -
      + {{/unless}} + {{#each this.products as |product|}} +
    6. +
      +

      + {{product.name}} +

      + {{#each product.subscriptions as |sub|}} +
      + + -
      -
      - +
      + Created on {{sub.startDate}} +
      + + View on Stripe + + + {{#if sub.cancel_at_period_end}} + + {{else}} + + {{/if}} +
      +
      +
      + {{/each}}
      -
      -
    7. + + {{/each}} + {{#if this.products}} - + {{/if}}
    @@ -250,15 +246,17 @@
    - +
    {{#if this.showMemberProductModal}} - + + @confirm={{this.addProduct}} + @closeModal={{this.closeMemberProductModal}} /> + {{/if}} \ No newline at end of file diff --git a/app/components/gh-member-settings-form-cp.js b/app/components/gh-member-settings-form-cp.js index 5698651d14..c518e3fd37 100644 --- a/app/components/gh-member-settings-form-cp.js +++ b/app/components/gh-member-settings-form-cp.js @@ -1,86 +1,104 @@ -import Component from '@ember/component'; +import Component from '@glimmer/component'; import moment from 'moment'; import {action} from '@ember/object'; -import {computed} from '@ember/object'; -import {gt} from '@ember/object/computed'; +import {getNonDecimal, getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; -import {task} from 'ember-concurrency'; - -export default Component.extend({ - membersUtils: service(), - feature: service(), - config: service(), - mediaQueries: service(), - ghostPaths: service(), - ajax: service(), - store: service(), - - stripeDetailsType: 'subscription', - - // Allowed actions - setProperty: () => {}, +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; + +export default class extends Component { + @service + membersUtils + @service + ghostPaths + @service + ajax + @service + store + + constructor(...args) { + super(...args); + this.member = this.args.member; + this.scratchMember = this.args.scratchMember; + } + + @tracked + showMemberProductModal = false; + + get canShowStripeInfo() { + return !this.member.get('isNew') && this.membersUtils.isStripeEnabled; + } + + get products() { + let products = this.member.get('products') || []; + let subscriptions = this.member.get('subscriptions') || []; + let subscriptionData = subscriptions.map((sub) => { + return { + ...sub, + startDate: sub.start_date ? moment(sub.start_date).format('D MMM YYYY') : '-', + validUntil: sub.current_period_end ? moment(sub.current_period_end).format('D MMM YYYY') : '-', + price: { + ...sub.price, + currencySymbol: getSymbol(sub.price.currency), + nonDecimalAmount: getNonDecimal(sub.price.amount) + } + }; + }); - hasMultipleSubscriptions: gt('member.subscriptions', 1), + for (let product of products) { + let productSubscriptions = subscriptionData.filter((subscription) => { + if (subscription.status === 'canceled') { + return false; + } + return subscription?.price?.product?.product_id === product.id; + }); + product.subscriptions = productSubscriptions; + } - canShowStripeInfo: computed('member.isNew', 'membersUtils.isStripeEnabled', function () { - let stripeEnabled = this.membersUtils.isStripeEnabled; + return products; + } - if (this.member.get('isNew') || !stripeEnabled) { - return false; - } else { - return true; - } - }), - - subscriptions: computed('member.subscriptions', function () { - let subscriptions = this.member.get('subscriptions'); - if (subscriptions && subscriptions.length > 0) { - return subscriptions.map((subscription) => { - const statusLabel = subscription.status ? subscription.status.replace('_', ' ') : ''; - return { - id: subscription.id, - customer: subscription.customer, - name: subscription.name || '', - email: subscription.email || '', - status: subscription.status, - statusLabel: statusLabel, - startDate: subscription.start_date ? moment(subscription.start_date).format('D MMM YYYY') : '-', - plan: subscription.plan, - amount: parseInt(subscription.plan.amount) ? (subscription.plan.amount / 100) : 0, - cancelAtPeriodEnd: subscription.cancel_at_period_end, - cancellationReason: subscription.cancellation_reason, - validUntil: subscription.current_period_end ? moment(subscription.current_period_end).format('D MMM YYYY') : '-' - }; - }).reverse(); - } - return null; - }), + get customer() { + let firstSubscription = this.member.get('subscriptions').firstObject; + let customer = firstSubscription?.customer; - customer: computed('subscriptions.[]', function () { - let customer = this.subscriptions.firstObject?.customer; if (customer) { - return Object.assign({}, this.subscriptions.firstObject?.customer, { - startDate: this.subscriptions.firstObject?.startDate - }); + return { + ...customer, + startDate: firstSubscription?.startDate + }; } return null; - }), - - actions: { - setProperty(property, value) { - this.setProperty(property, value); - }, - setLabels(labels) { - this.member.set('labels', labels); - } - }, + } + + @action + setProperty(property, value) { + this.args.setProperty(property, value); + } - changeStripeDetailsType: action(function (type) { - this.set('stripeDetailsType', type); - }), + @action + setLabels(labels) { + this.member.set('labels', labels); + } - cancelSubscription: task(function* (subscriptionId) { - let url = this.get('ghostPaths.url').api('members', this.member.get('id'), 'subscriptions', subscriptionId); + @action + closeMemberProductModal() { + this.showMemberProductModal = false; + } + + @action + cancelSubscription(subscriptionId) { + this.cancelSubscriptionTask.perform(subscriptionId); + } + + @action + continueSubscription(subscriptionId) { + this.continueSubscriptionTask.perform(subscriptionId); + } + + @task({drop: true}) + *cancelSubscriptionTask(subscriptionId) { + let url = this.ghostPaths.url.api('members', this.member.get('id'), 'subscriptions', subscriptionId); let response = yield this.ajax.put(url, { data: { @@ -90,10 +108,11 @@ export default Component.extend({ this.store.pushPayload('member', response); return response; - }).drop(), + } - continueSubscription: task(function* (subscriptionId) { - let url = this.get('ghostPaths.url').api('members', this.member.get('id'), 'subscriptions', subscriptionId); + @task({drop: true}) + *continueSubscriptionTask(subscriptionId) { + let url = this.ghostPaths.url.api('members', this.member.get('id'), 'subscriptions', subscriptionId); let response = yield this.ajax.put(url, { data: { @@ -103,9 +122,5 @@ export default Component.extend({ this.store.pushPayload('member', response); return response; - }).drop(), - - closeMemberProductModal: action(function () { - this.set('showMemberProductModal', false); - }) -}); + } +} diff --git a/app/components/modal-member-product.hbs b/app/components/modal-member-product.hbs index b29ae7353c..f2a453dda5 100644 --- a/app/components/modal-member-product.hbs +++ b/app/components/modal-member-product.hbs @@ -24,14 +24,35 @@
    - + - + + + {{svg-jar "arrow-down-small"}} + - + - + + + {{svg-jar "arrow-down-small"}} + + {{#if this.cannotAddPrice}} + + Use Stripe Dashboard to add product with non-zero prices. + + {{/if}}
    @@ -41,7 +62,7 @@ \ No newline at end of file diff --git a/app/components/modal-member-product.js b/app/components/modal-member-product.js index f3be7ef125..4d1b8fd373 100644 --- a/app/components/modal-member-product.js +++ b/app/components/modal-member-product.js @@ -1,6 +1,89 @@ import ModalComponent from 'ghost-admin/components/modal-base'; -import {alias} from '@ember/object/computed'; +import {action} from '@ember/object'; +import {getNonDecimal, getSymbol} from 'ghost-admin/utils/currency'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; -export default ModalComponent.extend({ - member: alias('model') -}); \ No newline at end of file +export default class ModalMemberProduct extends ModalComponent { + @service + store + + @service + ghostPaths + + @service + ajax + + @tracked + price + + @tracked + product + + @tracked + products = [] + + constructor(...args) { + super(...args); + this.fetchProducts(); + } + + async fetchProducts() { + this.products = await this.store.query('product', {include: 'stripe_prices'}); + this.product = this.products.firstObject; + } + + get member() { + return this.model; + } + + get cannotAddPrice() { + return !this.price || this.price.amount !== 0; + } + + get prices() { + if (!this.products || !this.products.length) { + return []; + } + if (this.product) { + return this.products.find((product) => { + return product.id === this.product.id; + }).stripePrices.map((price) => { + return { + ...price, + label: `${price.nickname} (${getSymbol(price.currency)}${getNonDecimal(price.amount)}/${price.interval})` + }; + }); + } else { + return []; + } + } + + @action + setProduct(product) { + this.product = product; + } + + @action + setPrice(price) { + this.price = price; + } + + @task({ + drop: true + }) + *addPriceTask() { + let url = this.ghostPaths.url.api('members', this.member.get('id'), 'subscriptions'); + + let response = yield this.ajax.post(url, { + data: { + stripe_price_id: this.price.stripe_price_id + } + }); + + this.store.pushPayload('member', response); + this.closeModal(); + return response; + } +} diff --git a/app/controllers/member.js b/app/controllers/member.js index 318dacfdb5..4f9b40dcef 100644 --- a/app/controllers/member.js +++ b/app/controllers/member.js @@ -146,8 +146,9 @@ export default class MemberController extends Controller { *fetchMemberTask(memberId) { this.isLoading = true; - this.member = yield this.store.findRecord('member', memberId, { - reload: true + this.member = yield this.store.queryRecord('member', { + id: memberId, + include: 'email_recipients,products' }); this.isLoading = false; diff --git a/app/models/member-product.js b/app/models/member-product.js new file mode 100644 index 0000000000..0d5ab2b382 --- /dev/null +++ b/app/models/member-product.js @@ -0,0 +1,6 @@ +import EmberObject from '@ember/object'; + +export default EmberObject.extend({ + name: 'Name of the product', + slug: 'Slug for the product' +}); diff --git a/app/models/member.js b/app/models/member.js index e6f0326490..304383e923 100644 --- a/app/models/member.js +++ b/app/models/member.js @@ -18,6 +18,8 @@ export default Model.extend(ValidationEngine, { emailOpenedCount: attr('number', {defaultValue: 0}), emailOpenRate: attr('number'), + products: attr('member-product'), + labels: hasMany('label', {embedded: 'always', async: false}), emailRecipients: hasMany('emailRecipient', {embedded: 'always', async: false}), diff --git a/app/routes/member.js b/app/routes/member.js index 17aa70c9db..f6e4492c72 100644 --- a/app/routes/member.js +++ b/app/routes/member.js @@ -29,7 +29,7 @@ export default class MembersRoute extends AuthenticatedRoute { this._requiresBackgroundRefresh = false; if (params.member_id) { - return this.store.queryRecord('member', {id: params.member_id, include: 'email_recipients'}); + return this.store.queryRecord('member', {id: params.member_id, include: 'email_recipients,products'}); } else { return this.store.createRecord('member'); } diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index 24fdf282d8..0ea21cf6fb 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -627,6 +627,8 @@ textarea.gh-member-details-textarea { .gh-new-member-avatar { background: var(--midlightgrey-l1); + width: 81px; + height: 81px; } .gh-member-cancels-on-label { @@ -1552,7 +1554,7 @@ p.gh-members-import-errordetail:first-of-type { } .gh-cp-table .gh-member-stripe-label { - width: 150px; + width: 40px; color: var(--middarkgrey); } @@ -1563,10 +1565,8 @@ p.gh-members-import-errordetail:first-of-type { } /* Member's product list */ -.gh-memberproduct-name span.archived { - background: var(--midgrey); - color: #fff; - font-size: 1.2rem; +.gh-memberproduct-name { + margin-bottom: 6px !important; } .gh-memberproduct-actionlist { @@ -1577,6 +1577,10 @@ p.gh-members-import-errordetail:first-of-type { opacity: 0; } +.gh-memberproduct-list .gh-list-row:hover { + background: none !important; +} + .gh-memberproduct-list .gh-list-row:hover .gh-memberproduct-actionlist { opacity: 1; } @@ -1599,16 +1603,29 @@ p.gh-members-import-errordetail:first-of-type { } .gh-cp-memberproduct-showmore label { + display: inline-block; font-size: 1.3rem; - color: var(--middarkgrey); font-weight: 400; + line-height: 1.5em; + color: var(--middarkgrey); + margin: 4px 0 2px; cursor: pointer; } +.gh-cp-memberproduct-showmore label:hover { + color: var(--darkgrey); +} + .gh-cp-memberproduct-pricelabel { font-weight: 600; } +.gh-cp-memberproduct-showmore label span.archived { + background: var(--lightgrey-l2); + color: var(--midgrey); + font-size: 1.2rem; +} + .gh-cp-memberproduct-showmore label svg { width: 9px; height: 9px; @@ -1625,7 +1642,16 @@ p.gh-members-import-errordetail:first-of-type { font-size: 1.3rem; line-height: 1.7em; color: var(--middarkgrey); - margin: 4px 0 0 15px; + margin: 2px 0 16px 15px; +} + +.gh-cp-memberproduct-showmore .details .actions { + display: flex; + margin-top: 3px; +} + +.gh-cp-memberproduct-showmore .details .actions button span { + font-size: 1.3rem; } .gh-cp-memberproduct-showmore input[type=checkbox] { @@ -1648,7 +1674,7 @@ p.gh-members-import-errordetail:first-of-type { padding: 12px 0; } -.gh-memberproduct-add-product .gh-btn svg path { +.gh-btn-addproduct svg path { fill: var(--green); } @@ -1671,4 +1697,13 @@ p.gh-members-import-errordetail:first-of-type { .gh-member-product-memberdetails p { margin: 0; +} + +.gh-cp-memberproduct-noproduct { + display: flex; + flex-direction: column; + align-items: center; + font-size: 1.4rem; + color: var(--midgrey); + padding: 48px 0; } \ No newline at end of file diff --git a/app/styles/patterns/buttons.css b/app/styles/patterns/buttons.css index 554ce84311..be8253ad12 100644 --- a/app/styles/patterns/buttons.css +++ b/app/styles/patterns/buttons.css @@ -332,7 +332,7 @@ svg.gh-btn-icon-right { } .gh-btn-text.green span { - color: var(--green); + color: var(--green-d1); } .gh-btn-textfield-group span { diff --git a/app/transforms/member-product.js b/app/transforms/member-product.js new file mode 100644 index 0000000000..e5b5528208 --- /dev/null +++ b/app/transforms/member-product.js @@ -0,0 +1,30 @@ +import MemberProduct from 'ghost-admin/models/member-product'; +import Transform from '@ember-data/serializer/transform'; +import {A as emberA, isArray as isEmberArray} from '@ember/array'; + +export default Transform.extend({ + deserialize(serialized) { + let subscriptions, subscriptionArray; + + subscriptionArray = serialized || []; + + subscriptions = subscriptionArray.map(itemDetails => MemberProduct.create(itemDetails)); + + return emberA(subscriptions); + }, + + serialize(deserialized) { + let subscriptionArray; + + if (isEmberArray(deserialized)) { + subscriptionArray = deserialized.map((item) => { + return item; + }).compact(); + } else { + subscriptionArray = []; + } + + return subscriptionArray; + } +}); + From c1fbeb967f6718bc3f3224972a6e7d2648a09e7f Mon Sep 17 00:00:00 2001 From: Rishabh Garg Date: Mon, 26 Apr 2021 23:52:04 +0530 Subject: [PATCH 0149/3032] Wired new Products settings UI to API data (#1930) refs TryGhost/Team#627 This updates the new Products settings screens to use real data from API for existing Custom Products and Prices to populate them on UI and allow site owners to edit them. - List all Products of site and allow editing Product name - List all Prices for a product and allow editing individual Price names - Add new Prices on a Product --- .../gh-products-price-billingperiod.hbs | 4 + .../gh-products-price-billingperiod.js | 17 +++- app/components/modal-product-price.hbs | 33 +++++-- app/components/modal-product-price.js | 87 +++++++++++++++++-- app/controllers/settings/product.js | 58 +++++++++++-- app/mixins/validation-engine.js | 4 +- app/routes/settings/product.js | 56 +++++++++++- app/routes/settings/products.js | 2 +- app/styles/layouts/products.css | 34 +++++++- app/templates/settings/product.hbs | 40 +++++++-- app/transforms/stripe-price.js | 4 +- app/validators/product.js | 13 +++ 12 files changed, 307 insertions(+), 45 deletions(-) create mode 100644 app/validators/product.js diff --git a/app/components/gh-products-price-billingperiod.hbs b/app/components/gh-products-price-billingperiod.hbs index c9811c9bab..3a6fbf144a 100644 --- a/app/components/gh-products-price-billingperiod.hbs +++ b/app/components/gh-products-price-billingperiod.hbs @@ -6,6 +6,10 @@ @optionValuePath="period" @optionLabelPath="label" @optionTargetPath="period" + @includeBlank={{false}} + @promptIsSelectable={{false}} + @prompt="Select Interval" + @update={{action "updatePeriod"}} /> {{svg-jar "arrow-down-small"}} \ No newline at end of file diff --git a/app/components/gh-products-price-billingperiod.js b/app/components/gh-products-price-billingperiod.js index f583bfc400..d9a76b5eb6 100644 --- a/app/components/gh-products-price-billingperiod.js +++ b/app/components/gh-products-price-billingperiod.js @@ -1,4 +1,5 @@ import Component from '@glimmer/component'; +import {action} from '@ember/object'; import {inject as service} from '@ember/service'; const PERIODS = [ @@ -6,11 +7,16 @@ const PERIODS = [ {label: 'Yearly', period: 'year'} ]; -export default class GhPostsListItemComponent extends Component { +export default class GhProductsPriceBillingPeriodComponent extends Component { @service feature; @service session; @service settings; + constructor() { + super(...arguments); + this.availablePeriods = PERIODS; + } + get value() { const {value} = this.args; return value; @@ -19,8 +25,11 @@ export default class GhPostsListItemComponent extends Component { const {disabled} = this.args; return disabled || false; } - constructor() { - super(...arguments); - this.availablePeriods = PERIODS; + + @action + updatePeriod(newPeriod) { + if (this.args.updatePeriod) { + this.args.updatePeriod(this.args.value, newPeriod); + } } } diff --git a/app/components/modal-product-price.hbs b/app/components/modal-product-price.hbs index 2c18ca1683..4cb866622e 100644 --- a/app/components/modal-product-price.hbs +++ b/app/components/modal-product-price.hbs @@ -13,7 +13,8 @@ @@ -28,10 +29,29 @@ @class="gh-input" /> + + + + {{one-way-select this.selectedCurrencyObj + id="currency" + name="currency" + options=(readonly this.allCurrencies) + optionValuePath="value" + optionLabelPath="label" + disabled=this.isExistingPrice + update=(action "setCurrency") + }} + {{svg-jar "arrow-down-small"}} + +
    - + @@ -40,10 +60,9 @@ @value={{this.price.amount}} @type="number" @disabled={{this.isExistingPrice}} - {{!-- @input={{action (mut this._scratchStripeMonthlyAmount) value="target.value"}} --}} - {{!-- @focus-out={{action "validateStripePlans"}} --}} + @input={{action "setAmount" value="target.value"}} /> - {{capitalize (or this.price.currency 'usd')}} /{{or this.price.interval 'month'}} + {{capitalize (or this.currencyVal "usd")}} /{{or this.periodVal "month"}}
    @@ -101,7 +120,7 @@ + data-test-button="save-price" /> \ No newline at end of file diff --git a/app/components/modal-product-price.js b/app/components/modal-product-price.js index bd6d88ade2..0b4236cee5 100644 --- a/app/components/modal-product-price.js +++ b/app/components/modal-product-price.js @@ -1,12 +1,50 @@ import ModalBase from 'ghost-admin/components/modal-base'; import classic from 'ember-classic-decorator'; import {action} from '@ember/object'; +import {currencies} from 'ghost-admin/utils/currency'; +import {task} from 'ember-concurrency-decorators'; import {tracked} from '@glimmer/tracking'; // TODO: update modals to work fully with Glimmer components @classic export default class ModalProductPrice extends ModalBase { @tracked model; + @tracked price; + @tracked currencyVal; + @tracked periodVal; + + init() { + super.init(...arguments); + this.price = { + ...(this.model.price || {}) + }; + this.topCurrencies = currencies.slice(0, 5).map((currency) => { + return { + value: currency.isoCode.toLowerCase(), + label: `${currency.isoCode} - ${currency.name}`, + isoCode: currency.isoCode + }; + }); + this.currencies = currencies.slice(5, currencies.length).map((currency) => { + return { + value: currency.isoCode.toLowerCase(), + label: `${currency.isoCode} - ${currency.name}`, + isoCode: currency.isoCode + }; + }); + this.allCurrencies = [ + { + groupName: '—', + options: this.get('topCurrencies') + }, + { + groupName: '—', + options: this.get('currencies') + } + ]; + this.currencyVal = this.price.currency || 'usd'; + this.periodVal = this.price.interval || 'month'; + } get title() { if (this.isExistingPrice) { @@ -15,18 +53,22 @@ export default class ModalProductPrice extends ModalBase { return 'New Price'; } - get price() { - return this.model.price || {}; - } - get isExistingPrice() { return !!this.model.price; } + get currency() { + return this.price.currency || 'usd'; + } + + get selectedCurrencyObj() { + return this.currencies.findBy('value', this.price.currency) || this.topCurrencies.findBy('value', this.price.currency); + } + // TODO: rename to confirm() when modals have full Glimmer support @action confirmAction() { - this.confirm(this.role); + this.confirm(this.price); this.close(); } @@ -36,16 +78,43 @@ export default class ModalProductPrice extends ModalBase { this.closeModal(); } - // @action - // setRoleFromModel() { - // this.role = this.model; - // } + @task({drop: true}) + *savePrice() { + try { + const priceObj = { + ...this.price, + amount: (this.price.amount || 0) * 100 + }; + if (!priceObj.id) { + priceObj.active = 1; + priceObj.currency = priceObj.currency || 'usd'; + priceObj.interval = priceObj.interval || 'month'; + priceObj.type = 'recurring'; + } + yield this.confirm(priceObj); + } catch (error) { + this.notifications.showAPIError(error, {key: 'price.save.failed'}); + } finally { + this.send('closeModal'); + } + } actions = { confirm() { this.confirmAction(...arguments); }, + updatePeriod(oldPeriod, newPeriod) { + this.price.interval = newPeriod; + this.periodVal = newPeriod; + }, + setAmount(amount) { + this.price.amount = !isNaN(amount) ? parseInt(amount) : 0; + }, + setCurrency(currency) { + this.price.currency = currency.value; + this.currencyVal = currency.value; + }, // needed because ModalBase uses .send() for keyboard events closeModal() { this.close(); diff --git a/app/controllers/settings/product.js b/app/controllers/settings/product.js index 72fc9eea03..86decef92d 100644 --- a/app/controllers/settings/product.js +++ b/app/controllers/settings/product.js @@ -1,5 +1,5 @@ import Controller from '@ember/controller'; -import {action} from '@ember/object'; +import EmberObject, {action} from '@ember/object'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; import {tracked} from '@glimmer/tracking'; @@ -10,6 +10,7 @@ export default class ProductController extends Controller { @tracked showLeaveSettingsModal = false; @tracked showPriceModal = false; @tracked priceModel = null; + @tracked showUnsavedChangesModal = false; get product() { return this.model; @@ -29,12 +30,35 @@ export default class ProductController extends Controller { return (this.product.stripePrices || []).length; } - leaveRoute(transition) { - if (this.settings.get('hasDirtyAttributes')) { - transition.abort(); - this.leaveSettingsTransition = transition; - this.showLeaveSettingsModal = true; + @action + toggleUnsavedChangesModal(transition) { + let leaveTransition = this.leaveScreenTransition; + + if (!transition && this.showUnsavedChangesModal) { + this.leaveScreenTransition = null; + this.showUnsavedChangesModal = false; + return; } + + if (!leaveTransition || transition.targetName === leaveTransition.targetName) { + this.leaveScreenTransition = transition; + + // if a save is running, wait for it to finish then transition + if (this.saveTask.isRunning) { + return this.saveTask.last.then(() => { + transition.retry(); + }); + } + + // we genuinely have unsaved data, show the modal + this.showUnsavedChangesModal = true; + } + } + + @action + leaveScreen() { + this.product.rollbackAttributes(); + return this.leaveScreenTransition.retry(); } @action @@ -62,6 +86,26 @@ export default class ProductController extends Controller { this.leaveSettingsTransition = null; } + @action + save() { + return this.saveTask.perform(); + } + + @action + savePrice(price) { + const stripePrices = this.product.stripePrices.map((d) => { + if (d.id === price.id) { + return EmberObject.create(price); + } + return d; + }); + if (!price.id) { + stripePrices.push(EmberObject.create(price)); + } + this.product.set('stripePrices', stripePrices); + this.saveTask.perform(); + } + @action closePriceModal() { this.showPriceModal = false; @@ -69,6 +113,6 @@ export default class ProductController extends Controller { @task({drop: true}) *saveTask() { - return yield this.settings.save(); + return yield this.product.save(); } } diff --git a/app/mixins/validation-engine.js b/app/mixins/validation-engine.js index 0a074d2da0..4bbc5633f4 100644 --- a/app/mixins/validation-engine.js +++ b/app/mixins/validation-engine.js @@ -10,6 +10,7 @@ import Mixin from '@ember/object/mixin'; import Model from '@ember-data/model'; import NavItemValidator from 'ghost-admin/validators/nav-item'; import PostValidator from 'ghost-admin/validators/post'; +import ProductValidator from 'ghost-admin/validators/product'; import RSVP from 'rsvp'; import ResetValidator from 'ghost-admin/validators/reset'; import SettingValidator from 'ghost-admin/validators/setting'; @@ -54,7 +55,8 @@ export default Mixin.create({ integration: IntegrationValidator, webhook: WebhookValidator, label: LabelValidator, - snippet: SnippetValidator + snippet: SnippetValidator, + product: ProductValidator }, // This adds the Errors object to the validation engine, and shouldn't affect diff --git a/app/routes/settings/product.js b/app/routes/settings/product.js index c62c70a628..360171b346 100644 --- a/app/routes/settings/product.js +++ b/app/routes/settings/product.js @@ -1,8 +1,19 @@ import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; +import {action} from '@ember/object'; import {inject as service} from '@ember/service'; export default class ProductRoute extends AuthenticatedRoute { @service store + @service router; + + _requiresBackgroundRefresh = true; + + constructor() { + super(...arguments); + this.router.on('routeWillChange', (transition) => { + this.showUnsavedChangesModal(transition); + }); + } model(params) { if (params.product_id) { @@ -12,15 +23,54 @@ export default class ProductRoute extends AuthenticatedRoute { } } - actions = { - willTransition(transition) { - return this.controller.leaveRoute(transition); + beforeModel() { + super.beforeModel(...arguments); + return this.session.user.then((user) => { + if (!user.isOwnerOrAdmin) { + return this.transitionTo('home'); + } + }); + } + + setupController(controller, product) { + super.setupController(...arguments); + if (this._requiresBackgroundRefresh) { + if (product.get('id')) { + return this.store.queryRecord('product', {id: product.get('id'), include: 'stripe_prices'}); + } } } + deactivate() { + super.deactivate(...arguments); + // clean up newly created records and revert unsaved changes to existing + this.controller.product.rollbackAttributes(); + this._requiresBackgroundRefresh = true; + } + + @action + save() { + this.controller.save(); + } + buildRouteInfoMetadata() { return { titleToken: 'Settings - Products' }; } + + showUnsavedChangesModal(transition) { + if (transition.from && transition.from.name === this.routeName && transition.targetName) { + let {controller} = this; + + // product.changedAttributes is always true for new products but number of changed attrs is reliable + let isChanged = Object.keys(controller.product.changedAttributes()).length > 0; + + if (!controller.product.isDeleted && isChanged) { + transition.abort(); + controller.toggleUnsavedChangesModal(transition); + return; + } + } + } } diff --git a/app/routes/settings/products.js b/app/routes/settings/products.js index 5c2290e14d..0713b7be2b 100644 --- a/app/routes/settings/products.js +++ b/app/routes/settings/products.js @@ -11,6 +11,6 @@ export default class ProductsRoute extends AuthenticatedRoute { } model() { - return this.store.findAll('product'); + return this.store.findAll('product', {include: 'stripe_prices'}); } } diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index 822473e5b9..f2f564e17e 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -121,6 +121,7 @@ justify-content: flex-end; width: 100%; opacity: 0; + line-height: 1; } .gh-price-list .gh-list-row:hover .gh-price-list-actionlist { @@ -129,13 +130,32 @@ .gh-price-list-actionlist a, .gh-price-list-actionlist button { + margin-left: 15px; + padding: 0; line-height: 0; - margin-left: 24px; +} + +.gh-price-list-actionlist a span, +.gh-price-list-actionlist button span { + display: inline-block; + line-height: 1; + height: unset; + border-radius: 3px; + padding: 4px 6px; color: var(--darkgrey); font-weight: 500; + font-size: 1.2rem !important; + text-transform: uppercase; } -.gh-price-list-actionlist button.archive { +.gh-price-list-actionlist a:hover span, +.gh-price-list-actionlist button:hover span { + background: var(--whitegrey); +} + +.gh-price-list-actionlist a.archived:hover span, +.gh-price-list-actionlist button.archived:hover span { + background: color-mod(var(--red) a(10%)); color: var(--red); } @@ -157,6 +177,14 @@ opacity: 0.5; } +.gh-price-list-noprices { + display: flex; + flex-direction: column; + align-items: center; + padding: 48px 0; + color: var(--midgrey); +} + .product-actions-menu { top: calc(100% + 6px); right: 10px; @@ -177,4 +205,4 @@ display: grid; grid-template-columns: 1fr 1fr; grid-gap: 20px; -} \ No newline at end of file +} diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index 69d82a342c..6c4ba917a3 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -81,6 +81,18 @@
    Subscriptions
    + {{#unless this.stripePrices}} + + +
    +
    There are no prices for this product.
    + +
    + + + {{/unless}} {{#each this.stripePrices as |price|}}
  • @@ -102,11 +114,11 @@
    - {{#if price.active}} - {{else}} @@ -118,28 +130,38 @@ {{/each}} + {{#if this.stripePrices}} + {{/if}}
    {{#if this.showPriceModal}} + {{!-- + + --}} + @modifier="action wide body-scrolling product-ssprice" /> {{/if}} - {{#if this.showLeaveSettingsModal}} + {{#if this.showUnsavedChangesModal}} + @confirm={{this.leaveScreen}} + @close={{this.toggleUnsavedChangesModal}} + @modifier="action wide" /> {{/if}} \ No newline at end of file diff --git a/app/transforms/stripe-price.js b/app/transforms/stripe-price.js index fee1872699..a3ecaa4fdc 100644 --- a/app/transforms/stripe-price.js +++ b/app/transforms/stripe-price.js @@ -4,7 +4,9 @@ import {A as emberA, isArray as isEmberArray} from '@ember/array'; export default Transform.extend({ deserialize(serialized = []) { - return emberA(serialized.map(StripePrice.create.bind(StripePrice))); + const stripePrices = serialized.map(itemDetails => StripePrice.create(itemDetails)); + + return emberA(stripePrices); }, serialize(deserialized) { diff --git a/app/validators/product.js b/app/validators/product.js new file mode 100644 index 0000000000..75a88812e0 --- /dev/null +++ b/app/validators/product.js @@ -0,0 +1,13 @@ +import BaseValidator from './base'; +import validator from 'validator'; + +export default BaseValidator.create({ + properties: ['name'], + + name(model) { + if (!validator.isLength(model.name || '', 0, 191)) { + model.errors.add('name', 'Name cannot be longer than 191 characters.'); + this.invalidate(); + } + } +}); From ce106e78a36b700b67b02083fac4c9197d51c0d3 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 26 Apr 2021 20:42:16 +0200 Subject: [PATCH 0150/3032] Updated price form design - rearranged order of input fields and dropdowns on new/edit Price modal --- app/components/modal-product-price.hbs | 52 +++++++++++++------------- app/styles/layouts/products.css | 4 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/app/components/modal-product-price.hbs b/app/components/modal-product-price.hbs index 4cb866622e..2bc67bdef2 100644 --- a/app/components/modal-product-price.hbs +++ b/app/components/modal-product-price.hbs @@ -29,44 +29,44 @@ @class="gh-input" /> - - - - {{one-way-select this.selectedCurrencyObj - id="currency" - name="currency" - options=(readonly this.allCurrencies) - optionValuePath="value" - optionLabelPath="label" - disabled=this.isExistingPrice - update=(action "setCurrency") - }} - {{svg-jar "arrow-down-small"}} - - -
    - - - - +
    -
    +
    - {{capitalize (or this.currencyVal "usd")}} /{{or this.periodVal "month"}} + {{!-- {{capitalize (or this.currencyVal "usd")}} /{{or this.periodVal "month"}} --}}
    + + + + {{one-way-select this.selectedCurrencyObj + id="currency" + name="currency" + options=(readonly this.allCurrencies) + optionValuePath="value" + optionLabelPath="label" + disabled=this.isExistingPrice + update=(action "setCurrency") + }} + {{svg-jar "arrow-down-small"}} + +
    + + + +

    Advanced

    diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index f2f564e17e..4d9883ef0a 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -201,8 +201,8 @@ margin-bottom: 32px; } -.gh-product-priceform-period { +.gh-product-priceform-pricecurrency { display: grid; - grid-template-columns: 1fr 1fr; + grid-template-columns: 1fr 2fr; grid-gap: 20px; } From e3cbbfb53601ccec650e0ea68c69444328bed97b Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 26 Apr 2021 20:55:25 +0200 Subject: [PATCH 0151/3032] Updated custom products styles - updated mocked data for product and price list - updated disabled button style on "Add product to member" modal --- app/components/modal-member-product.hbs | 2 +- app/styles/layouts/members.css | 9 +++++++++ app/templates/settings/product.hbs | 4 ++-- app/templates/settings/products.hbs | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/components/modal-member-product.hbs b/app/components/modal-member-product.hbs index f2a453dda5..0abced7775 100644 --- a/app/components/modal-member-product.hbs +++ b/app/components/modal-member-product.hbs @@ -72,6 +72,6 @@ @successText={{this.successText}} @task={{this.addPriceTask}} @disabled={{this.cannotAddPrice}} - @class="gh-btn gh-btn-black gh-btn-icon" + @class="gh-btn gh-btn-black gh-btn-icon gh-btn-add-memberproduct" data-test-button="save-webhook" />
    \ No newline at end of file diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index 0ea21cf6fb..4f01f3bef1 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1706,4 +1706,13 @@ p.gh-members-import-errordetail:first-of-type { font-size: 1.4rem; color: var(--midgrey); padding: 48px 0; +} + +.gh-btn-add-memberproduct[disabled], +.gh-btn-add-memberproduct[disabled]:hover { + background: var(--lightgrey-l1) !important; +} + +.gh-btn-add-memberproduct[disabled] span { + color: var(--midgrey); } \ No newline at end of file diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index 6c4ba917a3..b37da98e5e 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -100,7 +100,7 @@ {{price.nickname}}

    - TODO: Description + Price description

    @@ -109,7 +109,7 @@
    - TODO + 0
    diff --git a/app/templates/settings/products.hbs b/app/templates/settings/products.hbs index 8555c32a48..7d6aff85cf 100644 --- a/app/templates/settings/products.hbs +++ b/app/templates/settings/products.hbs @@ -24,7 +24,7 @@ {{product.name}}

    - TODO: Product description + Product description

    From 4240aeb2eddbbf90984eb0cee2b665f9ba64ffcb Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 26 Apr 2021 21:01:46 +0200 Subject: [PATCH 0152/3032] Updated add product to member modal - added footnote to price dropdown --- app/components/modal-member-product.hbs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/components/modal-member-product.hbs b/app/components/modal-member-product.hbs index 0abced7775..b7d2c9f422 100644 --- a/app/components/modal-member-product.hbs +++ b/app/components/modal-member-product.hbs @@ -47,12 +47,10 @@ /> {{svg-jar "arrow-down-small"}} + {{#if this.cannotAddPrice}} +

    Please select a price with zero value. You can add non-zero prices on Stripe Dashboard.

    + {{/if}} - {{#if this.cannotAddPrice}} - - Use Stripe Dashboard to add product with non-zero prices. - - {{/if}}
    From 1206e94635cdbf5d454dc4ee46009f8a1beddac1 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 26 Apr 2021 21:09:37 +0200 Subject: [PATCH 0153/3032] Updated new product header --- app/templates/settings/product.hbs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index b37da98e5e..aa55017e3a 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -5,7 +5,11 @@ {{svg-jar "arrow-right"}} Products {{svg-jar "arrow-right"}} - {{product.name}} + {{#if product.name}} + {{product.name}} + {{else}} + New product + {{/if}}
    From 54be6ee895fc8893364d7e0c0bf9285a0c6489f2 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Mon, 26 Apr 2021 21:27:35 +0200 Subject: [PATCH 0154/3032] Updated SSO configuration settings styles in Labs --- app/styles/layouts/main.css | 2 +- app/styles/layouts/settings.css | 19 +++++++++- app/templates/settings/labs.hbs | 49 ++++++++++++++------------ public/assets/icons/google-favicon.svg | 6 ++++ 4 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 public/assets/icons/google-favicon.svg diff --git a/app/styles/layouts/main.css b/app/styles/layouts/main.css index 597e04962b..a27ef5d531 100644 --- a/app/styles/layouts/main.css +++ b/app/styles/layouts/main.css @@ -1228,7 +1228,7 @@ /* Grey background modifiers */ .gh-main-section-content.grey .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red), -.gh-expandable-content .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red) { +.gh-expandable-content .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):not(.gh-btn-black) { background: var(--whitegrey-d2); } diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 5a8df9a670..8731651f20 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -231,9 +231,14 @@ margin-bottom: 0; } +.gh-setting-content-extended p { + color: var(--midgrey); + font-size: 1.3rem; +} + .gh-setting-content-extended label { display: block; - font-size: 1.25rem; + font-size: 1.3rem; font-weight: 600; color: var(--darkgrey); margin-bottom: 4px; @@ -250,6 +255,18 @@ border: 1px solid var(--whitegrey-d2); } +.gh-setting-content-extended .gh-btn span { + height: 36px; + line-height: 36px; +} + +.gh-setting-content-extended svg { + position: relative; + bottom: 1px; + width: 18px; + margin-right: 8px; +} + .gh-setting-liquid-section .liquid-container, .gh-setting-liquid-section .liquid-child { padding: 0 20px; diff --git a/app/templates/settings/labs.hbs b/app/templates/settings/labs.hbs index c0213e3f10..4ade561abd 100644 --- a/app/templates/settings/labs.hbs +++ b/app/templates/settings/labs.hbs @@ -205,31 +205,36 @@
    {{#if this.isOAuthEnabled}} -
    - - To get started, you first have to set up Ghost to allow login and registration with Google OAuth2. Read our +
    + {{svg-jar "google-favicon"}}Configure Ghost in Google +

    + Read our {{!-- TODO: create an help desk article and update the url here --}} - setup guide here - -

    + setup guide + to help you get started +

    - - +
    + + +
    - - +
    + + +
    {{/if}} diff --git a/public/assets/icons/google-favicon.svg b/public/assets/icons/google-favicon.svg new file mode 100644 index 0000000000..17e2474f85 --- /dev/null +++ b/public/assets/icons/google-favicon.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From a6fa2fd2e6d0bec0e3c64915449f7535e813d2ad Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Mon, 26 Apr 2021 22:15:22 +0200 Subject: [PATCH 0155/3032] Updated Google SSO settings copy and styling --- app/styles/layouts/settings.css | 5 -- app/templates/settings/labs.hbs | 108 +++++++++++++++----------------- 2 files changed, 51 insertions(+), 62 deletions(-) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 8731651f20..0723553f93 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -231,11 +231,6 @@ margin-bottom: 0; } -.gh-setting-content-extended p { - color: var(--midgrey); - font-size: 1.3rem; -} - .gh-setting-content-extended label { display: block; font-size: 1.3rem; diff --git a/app/templates/settings/labs.hbs b/app/templates/settings/labs.hbs index 4ade561abd..ff843164c6 100644 --- a/app/templates/settings/labs.hbs +++ b/app/templates/settings/labs.hbs @@ -181,66 +181,60 @@
    {{#if (enable-developer-experiments)}} -
    -
    -
    -
    -

    Enable Google OAuth authentication

    -

    - Allow your staff users to sign in to Ghost with Google Single Sign-On -

    -
    -
    - -
    +
    +
    +
    +

    Google OAuth for staff users

    +

    + Allow people to sign into Ghost Admin using Google SSO, + {{!-- TODO: create an help desk article and update the url here --}} + docs here +

    -
    - {{#if this.isOAuthEnabled}} -
    - {{svg-jar "google-favicon"}}Configure Ghost in Google -

    - Read our - {{!-- TODO: create an help desk article and update the url here --}} - setup guide - to help you get started -

    - -
    - - -
    - -
    - - -
    -
    -
    - {{/if}} +
    +
    -
    +
    + {{#if this.isOAuthEnabled}} +
    + {{svg-jar "google-favicon"}}Configure Google OAuth + +
    + + +
    + +
    + + +
    +
    +
    + {{/if}} +
    +
    {{/if}} From d6420c6524f98c7360028c72feb876e0785a7fbf Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 26 Apr 2021 20:42:57 +0000 Subject: [PATCH 0156/3032] Update dependency eslint-plugin-ghost to v2.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f517943b2e..ee875de4c0 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "ember-useragent": "0.10.0", "emberx-file-input": "1.2.1", "eslint": "7.25.0", - "eslint-plugin-ghost": "2.0.0", + "eslint-plugin-ghost": "2.1.0", "faker": "5.5.3", "fs-extra": "9.1.0", "glob": "7.1.6", diff --git a/yarn.lock b/yarn.lock index 089cebe549..c3f5c6b663 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7619,10 +7619,10 @@ eslint-plugin-ember@9.3.0: lodash.kebabcase "^4.1.1" snake-case "^3.0.3" -eslint-plugin-ghost@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ghost/-/eslint-plugin-ghost-2.0.0.tgz#14e67180188850abf978df772e02bb74b1832374" - integrity sha512-BlygF0CZr/38ena3qztpyCuo7z1KsbbjEz0FO3zjfg+V6Id5wcZsKTaOdFHFZwyDl4kBm5jujFAsWILh/DtNiQ== +eslint-plugin-ghost@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ghost/-/eslint-plugin-ghost-2.1.0.tgz#811402f32e6339be526368b1ce1b3b4be26a2e4d" + integrity sha512-zeAFtxthQ8GaC1LV4e+n6DMfLfl8AEAagYT63SQ1jYzYykK4Wmh0xEADMR0tZFl8eHzTornAyQWmWSwS7CUkXQ== dependencies: eslint-plugin-ember "9.3.0" eslint-plugin-mocha "8.0.0" From 39c556f42382cdac83d03529a3f41ae699c2b333 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Tue, 27 Apr 2021 09:47:30 +0200 Subject: [PATCH 0157/3032] Updated billing period prompt --- app/components/gh-products-price-billingperiod.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/gh-products-price-billingperiod.hbs b/app/components/gh-products-price-billingperiod.hbs index 3a6fbf144a..a35b18eab7 100644 --- a/app/components/gh-products-price-billingperiod.hbs +++ b/app/components/gh-products-price-billingperiod.hbs @@ -8,7 +8,7 @@ @optionTargetPath="period" @includeBlank={{false}} @promptIsSelectable={{false}} - @prompt="Select Interval" + @prompt="Select a billing period" @update={{action "updatePeriod"}} /> {{svg-jar "arrow-down-small"}} From 71f47ddb744cff24ab1ee376ae42178501ab2ab3 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 27 Apr 2021 13:47:32 +0530 Subject: [PATCH 0158/3032] Added adapter for products refs TryGhost/Team#627 Adds adapter for `product` to query records correctly --- app/adapters/product.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 app/adapters/product.js diff --git a/app/adapters/product.js b/app/adapters/product.js new file mode 100644 index 0000000000..21811abc08 --- /dev/null +++ b/app/adapters/product.js @@ -0,0 +1,25 @@ +import ApplicationAdapter from 'ghost-admin/adapters/application'; + +export default ApplicationAdapter.extend({ + queryRecord(store, type, query) { + if (query && query.id) { + let {id} = query; + delete query.id; + let url = this.buildURL(type.modelName, id, query, 'findRecord'); + return this.ajax(url, 'GET', {data: query}); + } + + return this._super(...arguments); + }, + + urlForDeleteRecord(id, modelName, snapshot) { + let url = this._super(...arguments); + let parsedUrl = new URL(url); + + if (snapshot && snapshot.adapterOptions && snapshot.adapterOptions.cancel) { + parsedUrl.searchParams.set('cancel', 'true'); + } + + return parsedUrl.toString(); + } +}); From eefbe80c2d65cbcb114a8f617228755278546ba9 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 27 Apr 2021 13:55:35 +0530 Subject: [PATCH 0159/3032] Added default sorting to product list refs https://github.com/TryGhost/Team/issues/633 Adds default alphabetical sorted order for Product list --- app/controllers/settings/products.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings/products.js b/app/controllers/settings/products.js index 47c4014f89..611c1cd004 100644 --- a/app/controllers/settings/products.js +++ b/app/controllers/settings/products.js @@ -2,6 +2,6 @@ import Controller from '@ember/controller'; export default class ProductsController extends Controller { get products() { - return this.model; + return this.model.sortBy('name'); } } From 5d3b54a873e6e6a402ed337545057bf4d7c1706b Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Tue, 27 Apr 2021 12:24:45 +0200 Subject: [PATCH 0160/3032] Fixed modal shadows being cut off bug --- app/styles/components/modals.css | 1 - app/styles/layouts/user.css | 12 ++++++++++++ app/styles/layouts/users.css | 9 +++++++++ app/templates/staff/index.hbs | 2 +- app/templates/staff/user.hbs | 1 + 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/styles/components/modals.css b/app/styles/components/modals.css index 2dd4cff82f..c3319e39e3 100644 --- a/app/styles/components/modals.css +++ b/app/styles/components/modals.css @@ -36,7 +36,6 @@ position: relative; z-index: 100; max-width: 550px; - overflow-y: auto; margin: auto; margin-top: 30px; margin-bottom: 30px; diff --git a/app/styles/layouts/user.css b/app/styles/layouts/user.css index 8288d561d1..e56615aa85 100644 --- a/app/styles/layouts/user.css +++ b/app/styles/layouts/user.css @@ -149,3 +149,15 @@ opacity: 0; transition: opacity 0.3s ease; } + +/* User roles modal +/* ---------------------------------------------------------- */ + +@media (max-height: 740px) { + .fullscreen-modal-change-role { + overflow-y: auto; + } + .fullscreen-modal-change-role .modal-content { + box-shadow: none !important; + } +} \ No newline at end of file diff --git a/app/styles/layouts/users.css b/app/styles/layouts/users.css index 0dfb21d790..981a80555e 100644 --- a/app/styles/layouts/users.css +++ b/app/styles/layouts/users.css @@ -147,6 +147,15 @@ /* User invitation modal /* ---------------------------------------------------------- */ +@media (max-height: 900px) { + .fullscreen-modal-invite-user { + overflow-y: auto; + } + .fullscreen-modal-invite-user .modal-content { + box-shadow: none !important; + } +} + .invite-new-user .modal-content { width: 100%; max-width: 600px; diff --git a/app/templates/staff/index.hbs b/app/templates/staff/index.hbs index 8ccdd562bd..07705bd236 100644 --- a/app/templates/staff/index.hbs +++ b/app/templates/staff/index.hbs @@ -12,7 +12,7 @@ {{#if this.showInviteUserModal}} + @modifier="action wide invite-user" /> {{/if}}
    diff --git a/app/templates/staff/user.hbs b/app/templates/staff/user.hbs index dcac6670f4..e98b289811 100644 --- a/app/templates/staff/user.hbs +++ b/app/templates/staff/user.hbs @@ -200,6 +200,7 @@ @model={{readonly this.user.role}} @confirm={{action "changeRole"}} @close={{action "toggleRoleSelectionModal"}} + @modifier="change-role" /> /> {{/if}} {{/if}} From c5e870c60e43f88836729d0cb57080becd834fd6 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 27 Apr 2021 15:36:45 +0100 Subject: [PATCH 0161/3032] Disabled portal subscription options when signup is disabled refs https://github.com/TryGhost/Team/issues/579 - subscription access set to 'invite' or 'none' disables signup so it doesn't make sense to allow those options to be changed when the portal preview won't reflect the settings - fixed "expand"/"close" button not changing on the access screen signup access block --- app/components/modal-portal-settings.hbs | 17 +++++++++-------- app/templates/settings/members-access.hbs | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index 6f580e1bf0..c46f1073c8 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -4,7 +4,7 @@

    Portal settings

    -
    +

    Signup options

    @@ -21,7 +21,8 @@ checked={{this.settings.portalName}} id="signup-name-checkbox" name="signup-name-checkbox" - onclick={{action "togglePortalName" value="target.checked"}} + disabled={{not-eq this.settings.membersSignupAccess "all"}} + {{on "click" (action "togglePortalName" value="target.checked")}} > @@ -43,9 +44,9 @@ checked={{this.isFreeChecked}} id="free-plan" name="free-plan" - disabled={{not this.allowSelfSignup}} + disabled={{or (not this.isStripeConfigured) (not-eq this.settings.membersSignupAccess "all")}} class="gh-input post-settings-featured" - onclick={{action "toggleFreePlan" value="target.checked"}} + {{on "click" (action "toggleFreePlan" value="target.checked")}} data-test-checkbox="featured" > @@ -62,9 +63,9 @@ id="monthly-plan" name="monthly-plan" checked={{this.isMonthlyChecked}} - disabled={{not this.isStripeConfigured}} + disabled={{or (not this.isStripeConfigured) (not-eq this.settings.membersSignupAccess "all")}} class="gh-input post-settings-featured" - onclick={{action "toggleMonthlyPlan" value="target.checked"}} + {{on "click" (action "toggleMonthlyPlan" value="target.checked")}} data-test-checkbox="featured" > @@ -81,9 +82,9 @@ id="yearly-plan" name="yearly-plan" checked={{this.isYearlyChecked}} - disabled={{not this.isStripeConfigured}} + disabled={{or (not this.isStripeConfigured) (not-eq this.settings.membersSignupAccess "all")}} class="gh-input post-settings-featured" - onclick={{action "toggleYearlyPlan" value="target.checked"}} + {{on "click" (action "toggleYearlyPlan" value="target.checked")}} data-test-checkbox="featured" > diff --git a/app/templates/settings/members-access.hbs b/app/templates/settings/members-access.hbs index 9c9bf6d6c5..eff6edbf58 100644 --- a/app/templates/settings/members-access.hbs +++ b/app/templates/settings/members-access.hbs @@ -25,7 +25,7 @@

    Subscription access

    Who should be able to subscribe to your site?

    - +
    {{#liquid-if this.signupAccessOpen}} From 6c29d663c71d0aac62ed0549a852a2280f902c4b Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 27 Apr 2021 17:34:04 +0100 Subject: [PATCH 0162/3032] Fixed rollback when leaving portal settings without saving no issue - base modal component was throwing an error because the passed in `confirm` action for the leave settings modal wasn't async and didn't have a `.finally()` method --- app/controllers/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings.js b/app/controllers/settings.js index f362fd3f31..a01d5966f7 100644 --- a/app/controllers/settings.js +++ b/app/controllers/settings.js @@ -33,7 +33,7 @@ export default Controller.extend({ this.set('showLeaveSettingsModal', false); }, - leavePortalSettings() { + async leavePortalSettings() { this.settings.rollbackAttributes(); this.set('showPortalSettings', false); this.set('showLeaveSettingsModal', false); From 2fb10f2dd57f2ac0f1783709bc5bd76da8f9baa0 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 27 Apr 2021 18:03:13 +0100 Subject: [PATCH 0163/3032] Fixed rollback of selected plans when leaving portal settings no issue - the original `portalPlans` array was being modified by reference which was throwing off Ember Data's change tracking - switched to always creating a new plans array before any modifications take place --- app/components/gh-launch-wizard/set-pricing.js | 5 +++-- app/components/modal-portal-settings.js | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index b3e33e2843..338035ee41 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -172,13 +172,14 @@ export default class GhLaunchWizardSetPricingComponent extends Component { } updateAllowedPlan(plan, isChecked) { - const allowedPlans = this.settings.get('portalPlans') || []; + const portalPlans = this.settings.get('portalPlans') || []; + const allowedPlans = [...portalPlans]; if (!isChecked) { this.settings.set('portalPlans', allowedPlans.filter(p => p !== plan)); } else { allowedPlans.push(plan); - this.settings.set('portalPlans', [...allowedPlans]); + this.settings.set('portalPlans', allowedPlans); } this.updatePreviewUrl(); diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index fd511bb9ca..359c53591c 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -251,13 +251,14 @@ export default ModalComponent.extend({ }, updateAllowedPlan(plan, isChecked) { - const allowedPlans = this.settings.get('portalPlans') || []; + const portalPlans = this.settings.get('portalPlans') || []; + const allowedPlans = [...portalPlans]; if (!isChecked) { this.settings.set('portalPlans', allowedPlans.filter(p => p !== plan)); } else { allowedPlans.push(plan); - this.settings.set('portalPlans', [...allowedPlans]); + this.settings.set('portalPlans', allowedPlans); } }, From 2e5dace4e8e5eacb1b865b2170c99da89795241a Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 27 Apr 2021 18:35:05 +0100 Subject: [PATCH 0164/3032] Updated portal preview to pass `allowSelfSignup` as query param refs https://github.com/TryGhost/Team/issues/579 - portal reads `allowSelfSignup` from config at startup and so won't show the free plan if it was not selected when preview is first opened - updated `membersUtils.getPortalPreviewUrl()` to duplicate the `allowSelfSignup` logic from the server so it can be passed through to portal dynamically --- app/components/modal-portal-settings.js | 6 ++---- app/services/members-utils.js | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index 359c53591c..c94920d6be 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -49,8 +49,6 @@ export default ModalComponent.extend({ confirm() {}, - allowSelfSignup: equal('settings.membersSignupAccess', 'all'), - isStripeConfigured: reads('membersUtils.isStripeEnabled'), buttonIcon: computed('settings.portalButtonIcon', function () { @@ -85,9 +83,9 @@ export default ModalComponent.extend({ return selectedButtonStyle.includes('text'); }), - isFreeChecked: computed('settings.portalPlans.[]', 'allowSelfSignup', function () { + isFreeChecked: computed('settings.{portalPlans.[],membersSignupAccess}', function () { const allowedPlans = this.settings.get('portalPlans') || []; - return (this.allowSelfSignup && allowedPlans.includes('free')); + return (this.settings.get('membersSignupAccess') === 'all' && allowedPlans.includes('free')); }), isMonthlyChecked: computed('settings.portalPlans.[]', 'isStripeConfigured', function () { diff --git a/app/services/members-utils.js b/app/services/members-utils.js index 0cdd8ea890..752a2ce03e 100644 --- a/app/services/members-utils.js +++ b/app/services/members-utils.js @@ -40,6 +40,8 @@ export default class MembersUtilsService extends Service { const portalBase = '/#/portal/preview'; const settingsParam = new URLSearchParams(); const signupButtonText = this.settings.get('portalButtonSignupText') || ''; + const allowSelfSignup = this.settings.get('membersSignupAccess') === 'all' && + (!this.isStripeEnabled || isFreeChecked); settingsParam.append('button', this.settings.get('portalButton')); settingsParam.append('name', this.settings.get('portalName')); @@ -49,6 +51,7 @@ export default class MembersUtilsService extends Service { settingsParam.append('page', page); settingsParam.append('buttonIcon', encodeURIComponent(buttonIcon)); settingsParam.append('signupButtonText', encodeURIComponent(signupButtonText)); + settingsParam.append('allowSelfSignup', allowSelfSignup); if (this.settings.get('accentColor') === '' || this.settings.get('accentColor')) { settingsParam.append('accentColor', encodeURIComponent(`${this.settings.get('accentColor')}`)); From d57ac50cd6bdf3019d882bdf5b91e2fbfd7300db Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 27 Apr 2021 18:39:51 +0100 Subject: [PATCH 0165/3032] Fixed linting error --- app/components/modal-portal-settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index c94920d6be..3a81dc2c2b 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -2,8 +2,8 @@ import $ from 'jquery'; import ModalComponent from 'ghost-admin/components/modal-base'; import copyTextToClipboard from 'ghost-admin/utils/copy-text-to-clipboard'; import {computed} from '@ember/object'; -import {equal, reads} from '@ember/object/computed'; import {htmlSafe} from '@ember/string'; +import {reads} from '@ember/object/computed'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; import {task, timeout} from 'ember-concurrency'; From 79aa78b5f4472d02c41e9eba6b1293017c2611ea Mon Sep 17 00:00:00 2001 From: naz Date: Wed, 28 Apr 2021 19:29:25 +1200 Subject: [PATCH 0166/3032] Added limit check before adding new integration (#1934) refs https://github.com/TryGhost/Team/issues/599 - Previously user received genetic limit error after putting in integration name and clicking "create" button. This created a little frustrating experience. - The updated flow does the check before loading the integration modal, so the user receives communication about needed upgrade before doing any work --- ...upgrade-custom-integrations-host-limit.hbs | 20 ++++++++++++++++++ ...-upgrade-custom-integrations-host-limit.js | 12 +++++++++++ app/controllers/integrations/new.js | 12 ++++++++++- app/routes/integrations/new.js | 21 ++++++++++++++++++- app/templates/integrations/new.hbs | 19 ++++++++++++----- 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 app/components/modal-upgrade-custom-integrations-host-limit.hbs create mode 100644 app/components/modal-upgrade-custom-integrations-host-limit.js diff --git a/app/components/modal-upgrade-custom-integrations-host-limit.hbs b/app/components/modal-upgrade-custom-integrations-host-limit.hbs new file mode 100644 index 0000000000..fbc974e212 --- /dev/null +++ b/app/components/modal-upgrade-custom-integrations-host-limit.hbs @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/components/modal-upgrade-custom-integrations-host-limit.js b/app/components/modal-upgrade-custom-integrations-host-limit.js new file mode 100644 index 0000000000..11f1e858c2 --- /dev/null +++ b/app/components/modal-upgrade-custom-integrations-host-limit.js @@ -0,0 +1,12 @@ +import ModalComponent from 'ghost-admin/components/modal-base'; +import {inject as service} from '@ember/service'; + +export default ModalComponent.extend({ + router: service(), + + actions: { + upgrade: function () { + this.router.transitionTo('pro'); + } + } +}); diff --git a/app/controllers/integrations/new.js b/app/controllers/integrations/new.js index 481822b455..bfe3042cd6 100644 --- a/app/controllers/integrations/new.js +++ b/app/controllers/integrations/new.js @@ -1,8 +1,18 @@ import Controller from '@ember/controller'; import {alias} from '@ember/object/computed'; +import {computed} from '@ember/object'; export default Controller.extend({ - integration: alias('model'), + integration: alias('model.integration'), + hostLimitError: alias('model.hostLimitError'), + + showUpgradeModal: computed('hostLimitError', function () { + if (this.hostLimitError) { + return true; + } + + return false; + }), actions: { save() { diff --git a/app/routes/integrations/new.js b/app/routes/integrations/new.js index f680466045..507eea8b20 100644 --- a/app/routes/integrations/new.js +++ b/app/routes/integrations/new.js @@ -1,8 +1,27 @@ +import RSVP from 'rsvp'; import Route from '@ember/routing/route'; +import {inject as service} from '@ember/service'; export default Route.extend({ + limit: service(), + model() { - return this.store.createRecord('integration'); + if (this.limit.limiter + && this.limit.limiter.isLimited('customIntegrations')) { + return RSVP.hash({ + integration: this.store.createRecord('integration'), + hostLimitError: this.limit.limiter.errorIfWouldGoOverLimit('customIntegrations') + .then(() => null) + .catch((error) => { + return error; + }) + }); + } else { + return RSVP.hash({ + integration: this.store.createRecord('integration'), + hostLimitError: null + }); + } }, deactivate() { diff --git a/app/templates/integrations/new.hbs b/app/templates/integrations/new.hbs index 71182c4314..7797c9662c 100644 --- a/app/templates/integrations/new.hbs +++ b/app/templates/integrations/new.hbs @@ -1,5 +1,14 @@ - \ No newline at end of file +{{#if showUpgradeModal}} + +{{else}} + +{{/if}} \ No newline at end of file From 69ac2ebce1903782ade3bfcdbb9f1d61e87e1214 Mon Sep 17 00:00:00 2001 From: Naz Date: Wed, 28 Apr 2021 12:13:24 +0400 Subject: [PATCH 0167/3032] Fixed upgrade modal cta when publishing a post refs https://github.com/TryGhost/Team/issues/589 - Previous upgrade button behavior was opening up a new browser window leading to now retired billing site. Tha behavior change looks like an oversight we missed to cleanup when introducing an in-admin billing pabe "/pro" - The change follows similar pattern used in other limit check mesages where tha "upgrade" button takes the user to the billing page --- app/components/modal-upgrade-host-limit.js | 8 ++++---- app/templates/editor.hbs | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/components/modal-upgrade-host-limit.js b/app/components/modal-upgrade-host-limit.js index a2f4a348fd..967ed35f3d 100644 --- a/app/components/modal-upgrade-host-limit.js +++ b/app/components/modal-upgrade-host-limit.js @@ -1,17 +1,17 @@ import ModalComponent from 'ghost-admin/components/modal-base'; import {computed} from '@ember/object'; +import {inject as service} from '@ember/service'; export default ModalComponent.extend({ + router: service(), + upgradeMessage: computed('details', function () { const {limit, total} = this.model.details; return {limit, total}; }), actions: { upgrade: function () { - const upgradeLink = this.model.upgradeLink; - window.open(upgradeLink); - this.closeModal(); - return true; + this.router.transitionTo('pro'); } } }); diff --git a/app/templates/editor.hbs b/app/templates/editor.hbs index 6978929bba..f0daeda95e 100644 --- a/app/templates/editor.hbs +++ b/app/templates/editor.hbs @@ -142,7 +142,6 @@ @model={{hash message=hostLimitError.context details=hostLimitError.details - upgradeLink=hostLimitError.help }} @close={{action "closeUpgradeModal"}} @modifier="action wide" From b85f484b989ea4a76f7d74b5293861554af14fe8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Apr 2021 10:20:04 +0100 Subject: [PATCH 0168/3032] Update dependency ember-cli-string-helpers to v6 (#1931) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 109 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 104 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index ee875de4c0..f71b532110 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "ember-cli-node-assets": "0.2.2", "ember-cli-postcss": "6.0.1", "ember-cli-shims": "1.2.0", - "ember-cli-string-helpers": "5.0.0", + "ember-cli-string-helpers": "6.0.1", "ember-cli-terser": "4.0.1", "ember-cli-test-loader": "3.0.0", "ember-composable-helpers": "4.4.1", diff --git a/yarn.lock b/yarn.lock index c3f5c6b663..2f2291d6b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,6 +26,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1" integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ== +"@babel/compat-data@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" + integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== + "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.11.0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.3.4", "@babel/core@^7.8.7": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" @@ -47,6 +52,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.13.10": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" + integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.16" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.13.14" + "@babel/helpers" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.15" + "@babel/types" "^7.13.16" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + "@babel/generator@^7.12.10", "@babel/generator@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" @@ -65,6 +91,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.13.16": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" + integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg== + dependencies: + "@babel/types" "^7.13.16" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.4": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" @@ -100,6 +135,16 @@ browserslist "^4.14.5" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.13.16": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" + integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== + dependencies: + "@babel/compat-data" "^7.13.15" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" @@ -256,6 +301,20 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.12" +"@babel/helper-module-transforms@^7.13.14": + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" + integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.13" + "@babel/types" "^7.13.14" + "@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" @@ -378,6 +437,15 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" +"@babel/helpers@^7.13.16": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6" + integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.17" + "@babel/types" "^7.13.17" + "@babel/highlight@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" @@ -406,6 +474,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.12.tgz#ba320059420774394d3b0c0233ba40e4250b81d1" integrity sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw== +"@babel/parser@^7.13.16": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" + integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== + "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566" @@ -1134,6 +1207,20 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" + integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.16" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.16" + "@babel/types" "^7.13.17" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.7": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" @@ -1152,6 +1239,14 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" + integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -6478,13 +6573,15 @@ ember-cli-shims@1.2.0: ember-rfc176-data "^0.3.1" silent-error "^1.0.1" -ember-cli-string-helpers@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-5.0.0.tgz#b1e08ec3ca1c9a457f9fd9aafff60b5939fbf91d" - integrity sha512-PodD3Uf7BkOXIu95E6cWEC0ERroTiUOAwOr828Vb+fPFtV7WYNSC27C9Ds1ggCyyRqnXmpS0JSqCTN1gPZfkWQ== +ember-cli-string-helpers@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-6.0.1.tgz#6690b23b5cd60cc3ab86ce78125a2f9bd0f1cd41" + integrity sha512-91Po3HRroSI60zm9QUpnt6DXNB3rNBKFAmCptDD758gZyjfDMXtu1ZWWixB7EQXQaMy8bVq+2ZvQIPkclieJPw== dependencies: + "@babel/core" "^7.13.10" broccoli-funnel "^3.0.3" ember-cli-babel "^7.7.3" + resolve "^1.20.0" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" @@ -8723,7 +8820,7 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gensync@^1.0.0-beta.1: +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -13120,7 +13217,7 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13 is-core-module "^2.1.0" path-parse "^1.0.6" -resolve@^1.10.1, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.9.0: +resolve@^1.10.1, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.9.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== From 4eae21562654ba750b4f5faa5a312a9543ed9e75 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Apr 2021 10:20:21 +0100 Subject: [PATCH 0169/3032] Update dependency ember-auto-import to v1.11.3 (#1932) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f71b532110..489e023062 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "element-resize-detector": "1.2.2", "ember-ajax": "5.0.0", "ember-assign-helper": "0.3.0", - "ember-auto-import": "1.11.2", + "ember-auto-import": "1.11.3", "ember-classic-decorator": "2.0.0", "ember-cli": "3.21.2", "ember-cli-app-version": "5.0.0", diff --git a/yarn.lock b/yarn.lock index 2f2291d6b4..d90808f343 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6039,10 +6039,10 @@ ember-assign-polyfill@^2.6.0: ember-cli-babel "^7.20.5" ember-cli-version-checker "^2.0.0" -ember-auto-import@1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.2.tgz#b6e9a0dddd88a10692830ffa4f5dfd8c137c8919" - integrity sha512-Sm0x9qgAQEx+XSYeh5zeKj89Uo0c7XzULZxuziFPxbhtKy/G4pywhBuQ7EgDznTj8IZVxOdfe4ufcUxnJtbSgg== +ember-auto-import@1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.3.tgz#6e3384a7fbb163384a34546f2e902cd297b0e683" + integrity sha512-ekq/XCvsonESobFU30zjZ0I4XMy2E/2ZILCYWuQ1JdhcCSTYhnXDZcqRW8itUG7kbsPqAHT/XZ1LEZYm3seVwQ== dependencies: "@babel/core" "^7.1.6" "@babel/preset-env" "^7.10.2" From 1e984d3f8d1839e7382acbf5b543ac2e6d39749a Mon Sep 17 00:00:00 2001 From: Thibaut Patel Date: Wed, 28 Apr 2021 12:05:26 +0200 Subject: [PATCH 0170/3032] Added the oauth login button issue https://github.com/TryGhost/Team/issues/614 Shown conditionally only when oauth is setup on the server side. --- app/styles/layouts/flow.css | 29 +++++++++++++++++++++++++++++ app/templates/signin.hbs | 12 ++++++++++++ 2 files changed, 41 insertions(+) diff --git a/app/styles/layouts/flow.css b/app/styles/layouts/flow.css index 33c2bbe64e..4b1219c80a 100644 --- a/app/styles/layouts/flow.css +++ b/app/styles/layouts/flow.css @@ -241,6 +241,35 @@ line-height: 37px !important; } +.gh-flow-content .gh-center { + display: flex; + align-items: center; + justify-content: center; +} + +.gh-separator { + display: flex; + align-items: center; + text-align: center; + margin-top: 25px; + margin-bottom: 25px; +} + +.gh-separator::before, +.gh-separator::after { + content: ''; + flex: 1; + border-bottom: 1px solid var(--midgrey); +} + +.gh-separator:not(:empty)::before { + margin-right: 6px; +} + +.gh-separator:not(:empty)::after { + margin-left: 6px; +} + .gh-flow-content .gh-input:focus { box-shadow: none; border-color: color-mod(var(--midlightgrey) l(+10%)); diff --git a/app/templates/signin.hbs b/app/templates/signin.hbs index db64ff1e2f..d339eab3fc 100644 --- a/app/templates/signin.hbs +++ b/app/templates/signin.hbs @@ -24,6 +24,18 @@

    Sign in to {{this.config.blogTitle}}.

    + {{#if this.config.oauth}} + + +
    + or +
    + {{/if}} From 2ed6c06e78657460dd2f5601080287b4541c014b Mon Sep 17 00:00:00 2001 From: Naz Date: Wed, 28 Apr 2021 14:15:48 +0400 Subject: [PATCH 0171/3032] Fixed upgrade modal cta when activating a theme refs https://github.com/TryGhost/Team/issues/590 - Previous upgrade button behavior was opening up a new browser window leading to now retired billing site. Tha behavior change looks like an oversight we missed to cleanup when introducing an in-admin billing pabe "/pro" - The change follows similar pattern used in other limit check mesages where tha "upgrade" button takes the user to the billing page --- app/components/modal-upgrade-host-limit-custom-theme.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/components/modal-upgrade-host-limit-custom-theme.js b/app/components/modal-upgrade-host-limit-custom-theme.js index 5d4c025835..11f1e858c2 100644 --- a/app/components/modal-upgrade-host-limit-custom-theme.js +++ b/app/components/modal-upgrade-host-limit-custom-theme.js @@ -1,12 +1,12 @@ import ModalComponent from 'ghost-admin/components/modal-base'; +import {inject as service} from '@ember/service'; export default ModalComponent.extend({ + router: service(), + actions: { upgrade: function () { - const upgradeLink = this.model.upgradeLink; - window.open(upgradeLink); - this.closeModal(); - return true; + this.router.transitionTo('pro'); } } }); From 997463c49833c8d64068dae9e8d5b0d381e78c46 Mon Sep 17 00:00:00 2001 From: Naz Date: Wed, 28 Apr 2021 18:07:18 +0400 Subject: [PATCH 0172/3032] Added upgrade moal when unsuspending staff user refs https://github.com/TryGhost/Team/issues/587 - Previous behavior wa showing a generic API error in the top banner which wasn't ideal UX - With these changes user is informed about the limitation before performing any action with clear call to upgrade through the billing page --- ...odal-upgrade-unsuspend-user-host-limit.hbs | 20 +++++++++++++++++ ...modal-upgrade-unsuspend-user-host-limit.js | 12 ++++++++++ app/controllers/staff/user.js | 22 ++++++++++++++++++- app/services/limit.js | 3 ++- app/templates/staff/user.hbs | 19 +++++++++++----- 5 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 app/components/modal-upgrade-unsuspend-user-host-limit.hbs create mode 100644 app/components/modal-upgrade-unsuspend-user-host-limit.js diff --git a/app/components/modal-upgrade-unsuspend-user-host-limit.hbs b/app/components/modal-upgrade-unsuspend-user-host-limit.hbs new file mode 100644 index 0000000000..cf16fb53f5 --- /dev/null +++ b/app/components/modal-upgrade-unsuspend-user-host-limit.hbs @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/components/modal-upgrade-unsuspend-user-host-limit.js b/app/components/modal-upgrade-unsuspend-user-host-limit.js new file mode 100644 index 0000000000..11f1e858c2 --- /dev/null +++ b/app/components/modal-upgrade-unsuspend-user-host-limit.js @@ -0,0 +1,12 @@ +import ModalComponent from 'ghost-admin/components/modal-base'; +import {inject as service} from '@ember/service'; + +export default ModalComponent.extend({ + router: service(), + + actions: { + upgrade: function () { + this.router.transitionTo('pro'); + } + } +}); diff --git a/app/controllers/staff/user.js b/app/controllers/staff/user.js index d82e5089fc..2ba1e1538a 100644 --- a/app/controllers/staff/user.js +++ b/app/controllers/staff/user.js @@ -16,11 +16,13 @@ export default Controller.extend({ config: service(), dropdown: service(), ghostPaths: service(), + limit: service(), notifications: service(), session: service(), slugGenerator: service(), personalToken: null, + limitErrorMessage: null, personalTokenRegenerated: false, leaveSettingsTransition: null, dirtyAttributes: false, @@ -117,7 +119,25 @@ export default Controller.extend({ toggleUnsuspendUserModal() { if (this.deleteUserActionIsVisible) { - this.toggleProperty('showUnsuspendUserModal'); + if (this.user.role.name !== 'Contributor' + && this.limit.limiter + && this.limit.limiter.isLimited('staff') + ) { + this.limit.limiter.errorIfWouldGoOverLimit('staff') + .then(() => { + this.toggleProperty('showUnsuspendUserModal'); + }) + .catch((error) => { + if (error.errorType === 'HostLimitError') { + this.limitErrorMessage = error.message; + this.toggleProperty('showUnsuspendUserModal'); + } else { + this.notifications.showAPIError(error, {key: 'staff.limit'}); + } + }); + } else { + this.toggleProperty('showUnsuspendUserModal'); + } } }, diff --git a/app/services/limit.js b/app/services/limit.js index 1403e2a6e4..43766150c2 100644 --- a/app/services/limit.js +++ b/app/services/limit.js @@ -78,7 +78,8 @@ export default class LimitsService extends Service { async getStaffUsersCount() { return RSVP.hash({ users: this.store.findAll('user', {reload: true}), - invites: this.store.findAll('invite', {reload: true}) + invites: this.store.findAll('invite', {reload: true}), + roles: this.store.findAll('role', {reload: true}) // NOTE: roles have to be fetched as they are not always loaded with invites }).then((data) => { const staffUsers = data.users.filter(u => u.get('status') !== 'inactive' && u.role.get('name') !== 'Contributor'); const staffInvites = data.invites.filter(i => i.role.get('name') !== 'Contributor'); diff --git a/app/templates/staff/user.hbs b/app/templates/staff/user.hbs index e98b289811..a38824e7f9 100644 --- a/app/templates/staff/user.hbs +++ b/app/templates/staff/user.hbs @@ -84,11 +84,20 @@ {{/if}} {{#if this.showUnsuspendUserModal}} - + {{#if this.limitErrorMessage}} + + {{else}} + + {{/if}} {{/if}}
    From 4b4584ca2c70f156d55a2fd7d0c17c90a12045b4 Mon Sep 17 00:00:00 2001 From: Naz Date: Wed, 28 Apr 2021 18:08:58 +0400 Subject: [PATCH 0173/3032] Updated copy for user role upgrade and invite limits refs https://github.com/TryGhost/Team/issues/587 - Because we lack context when the component is called in "create new users" (invite) or in "modify existing user" (role upgrade) made copy more generic to fit both cases. --- app/components/gh-role-selection.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/gh-role-selection.hbs b/app/components/gh-role-selection.hbs index a9fd5eff5e..c3e82bc618 100644 --- a/app/components/gh-role-selection.hbs +++ b/app/components/gh-role-selection.hbs @@ -151,7 +151,7 @@ {{/if}} \ No newline at end of file From 621d319ae6c38c7d91103a55696fd870dfc51bf7 Mon Sep 17 00:00:00 2001 From: Aileen Nowak Date: Thu, 29 Apr 2021 16:23:14 +1200 Subject: [PATCH 0174/3032] Disabled Twitter link in footer no issue This is to remove some load from the Support team. Only commented it out, so it can be re-activated when we see fit. --- app/components/gh-nav-menu/footer.hbs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/gh-nav-menu/footer.hbs b/app/components/gh-nav-menu/footer.hbs index 5c5be9da41..b9bb8078bd 100644 --- a/app/components/gh-nav-menu/footer.hbs +++ b/app/components/gh-nav-menu/footer.hbs @@ -47,14 +47,14 @@ Support center
  • -
  • + {{!--
  • Tweet @Ghost! -
  • + --}}
  • How to use Ghost From f43f86fd8d916a83f4d2d1bd81a6197570975b35 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 29 Apr 2021 07:21:09 +0000 Subject: [PATCH 0175/3032] Update dependency ember-cli-babel to v7.26.4 --- package.json | 2 +- yarn.lock | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 489e023062..0baf8d4486 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "ember-classic-decorator": "2.0.0", "ember-cli": "3.21.2", "ember-cli-app-version": "5.0.0", - "ember-cli-babel": "7.26.3", + "ember-cli-babel": "7.26.4", "ember-cli-chart": "3.7.2", "ember-cli-dependency-checker": "3.2.0", "ember-cli-deprecation-workflow": "1.0.1", diff --git a/yarn.lock b/yarn.lock index d90808f343..d085f07e79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6164,10 +6164,10 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.26.3, ember-cli-babel@^7.12.0: - version "7.26.3" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.3.tgz#e93ce7ec458208894d10844cf76e41cc06fdbeb6" - integrity sha512-ZCs0g99d3kYaHs1+HT33oMY7/K+nLCAAv7dCLxsMzg7cQf55O6Pq4ZKnWEr3IHVs33xbJFnEb9prt1up36QVnw== +ember-cli-babel@7.26.4: + version "7.26.4" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.4.tgz#b73d53592c05479814ca1770b3b849d4e01a87f0" + integrity sha512-GibwLrBUVj8DxNMnbE5PObEIeznX6ohOdYHoSMmTkCBuXa/I9amRGIjBhNlDbAJj+exVKKZoEGAdrV13gnyftQ== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" @@ -6248,6 +6248,39 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cl rimraf "^3.0.1" semver "^5.5.0" +ember-cli-babel@^7.12.0: + version "7.26.3" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.3.tgz#e93ce7ec458208894d10844cf76e41cc06fdbeb6" + integrity sha512-ZCs0g99d3kYaHs1+HT33oMY7/K+nLCAAv7dCLxsMzg7cQf55O6Pq4ZKnWEr3IHVs33xbJFnEb9prt1up36QVnw== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" + rimraf "^3.0.1" + semver "^5.5.0" + ember-cli-babel@^7.23.1: version "7.26.2" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.2.tgz#497985e741ffcc08f89f98c9464509e91cdb2809" From 4334b94c82164f6dd699a46acde1227a236e3e8c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 29 Apr 2021 07:21:26 +0000 Subject: [PATCH 0176/3032] Update dependency ember-cli-terser to v4.0.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0baf8d4486..9fa49a9203 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "ember-cli-postcss": "6.0.1", "ember-cli-shims": "1.2.0", "ember-cli-string-helpers": "6.0.1", - "ember-cli-terser": "4.0.1", + "ember-cli-terser": "4.0.2", "ember-cli-test-loader": "3.0.0", "ember-composable-helpers": "4.4.1", "ember-concurrency": "2.0.3", diff --git a/yarn.lock b/yarn.lock index d085f07e79..aac8e449e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6621,10 +6621,10 @@ ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= -ember-cli-terser@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-terser/-/ember-cli-terser-4.0.1.tgz#0da0b8f2b09989e8c992b207553ddec1bbb65915" - integrity sha512-vvp0uVl8reYeW9EZjSXRPR3Bq7y4u9CYlUdI7j/WzMPDj3/gUHU4Z7CHYOCrftrClQvFfqO2eXmHwDA6F7SLug== +ember-cli-terser@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-terser/-/ember-cli-terser-4.0.2.tgz#c436a9e4159f76a615b051cba0584844652b7dcd" + integrity sha512-Ej77K+YhCZImotoi/CU2cfsoZaswoPlGaM5TB3LvjvPDlVPRhxUHO2RsaUVC5lsGeRLRiHCOxVtoJ6GyqexzFA== dependencies: broccoli-terser-sourcemap "^4.1.0" From e20a8997e77559154546f470bba4be689f9f04a0 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Thu, 29 Apr 2021 11:47:44 +0200 Subject: [PATCH 0177/3032] Updated upgrade button styles --- app/components/modal-upgrade-custom-integrations-host-limit.hbs | 2 +- app/components/modal-upgrade-host-limit.hbs | 2 +- app/components/modal-upgrade-unsuspend-user-host-limit.hbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/modal-upgrade-custom-integrations-host-limit.hbs b/app/components/modal-upgrade-custom-integrations-host-limit.hbs index fbc974e212..717b9ecb32 100644 --- a/app/components/modal-upgrade-custom-integrations-host-limit.hbs +++ b/app/components/modal-upgrade-custom-integrations-host-limit.hbs @@ -14,7 +14,7 @@ Cancel - \ No newline at end of file diff --git a/app/components/modal-upgrade-host-limit.hbs b/app/components/modal-upgrade-host-limit.hbs index ee0e190dd4..0cf88e3dc3 100644 --- a/app/components/modal-upgrade-host-limit.hbs +++ b/app/components/modal-upgrade-host-limit.hbs @@ -15,7 +15,7 @@ Cancel - \ No newline at end of file diff --git a/app/components/modal-upgrade-unsuspend-user-host-limit.hbs b/app/components/modal-upgrade-unsuspend-user-host-limit.hbs index cf16fb53f5..a4aabd019c 100644 --- a/app/components/modal-upgrade-unsuspend-user-host-limit.hbs +++ b/app/components/modal-upgrade-unsuspend-user-host-limit.hbs @@ -14,7 +14,7 @@ Cancel - \ No newline at end of file From 5fb87eb6326a18dfaffd2cb1cb36156b5af5b523 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Thu, 29 Apr 2021 12:12:55 +0100 Subject: [PATCH 0178/3032] v4.3.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60baba282f..ce0c0c3e0e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.3.2", + "version": "4.3.3", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From bf32eb0f0faaae5ccfe1068f4228331210b0e1fa Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Thu, 29 Apr 2021 15:01:42 +0200 Subject: [PATCH 0179/3032] Styled Google OAuth login button Refs https://github.com/TryGhost/Team/issues/612 --- app/styles/layouts/flow.css | 5 ++++- app/styles/patterns/buttons.css | 2 +- app/templates/signin.hbs | 5 ++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/styles/layouts/flow.css b/app/styles/layouts/flow.css index 4b1219c80a..9382059f3d 100644 --- a/app/styles/layouts/flow.css +++ b/app/styles/layouts/flow.css @@ -253,13 +253,16 @@ text-align: center; margin-top: 25px; margin-bottom: 25px; + font-size: 1.4rem; + font-weight: 400; + text-transform: uppercase; } .gh-separator::before, .gh-separator::after { content: ''; flex: 1; - border-bottom: 1px solid var(--midgrey); + border-bottom: 1px solid var(--lightgrey); } .gh-separator:not(:empty)::before { diff --git a/app/styles/patterns/buttons.css b/app/styles/patterns/buttons.css index be8253ad12..2ad2c12534 100644 --- a/app/styles/patterns/buttons.css +++ b/app/styles/patterns/buttons.css @@ -260,7 +260,7 @@ fieldset[disabled] .gh-btn { .gh-btn-block svg { width: 1em; height: 1em; - margin-right: 0.5em; + margin-right: 0.6em; fill: #fff; } diff --git a/app/templates/signin.hbs b/app/templates/signin.hbs index d339eab3fc..bcb3a9b940 100644 --- a/app/templates/signin.hbs +++ b/app/templates/signin.hbs @@ -27,9 +27,8 @@ {{#if this.config.oauth}}
    From 34183b2596a75a44601548b1fa19c687b23f6dd2 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 3 May 2021 18:53:56 +0200 Subject: [PATCH 0180/3032] Updated "What's new?" badge position - aligned "What's new?" dot position on account icon in nav bar --- app/styles/app-dark.css | 5 +++++ app/styles/layouts/main.css | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/styles/app-dark.css b/app/styles/app-dark.css index ef5a222017..e821443885 100644 --- a/app/styles/app-dark.css +++ b/app/styles/app-dark.css @@ -902,4 +902,9 @@ input:focus, .user-image { border-color: var(--dark-main-bg-color); +} + +.gh-whats-new-badge-account { + top: 0; + right: -2px; } \ No newline at end of file diff --git a/app/styles/layouts/main.css b/app/styles/layouts/main.css index a27ef5d531..80f7166dc8 100644 --- a/app/styles/layouts/main.css +++ b/app/styles/layouts/main.css @@ -1324,8 +1324,8 @@ /* What's new badges /* ---------------------------------------------------- */ .gh-whats-new-badge-account { - top: -3px; - right: -4px; + top: -1px; + right: -3px; border: 1px solid #fff; width: 12px; height: 12px; From dff1d2521ae767cfa68c2e398c21c1ab3d34b4f4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 May 2021 08:14:51 +0100 Subject: [PATCH 0181/3032] Update dependency broccoli-funnel to v3.0.5 (#1942) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 3b4e14ea9b..fb5a4daf63 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "blueimp-md5": "2.18.0", "broccoli-asset-rev": "3.0.0", "broccoli-concat": "4.2.5", - "broccoli-funnel": "3.0.4", + "broccoli-funnel": "3.0.5", "broccoli-merge-trees": "4.2.0", "broccoli-terser-sourcemap": "4.1.0", "chai": "4.3.4", diff --git a/yarn.lock b/yarn.lock index aac8e449e9..648cdf7c78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3944,14 +3944,14 @@ broccoli-funnel@2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.4.tgz#0fe6b7e8745fa4585f30470fbfe54653ce058e3c" - integrity sha512-6w0nhWvBeTnOQ0DGVM9mCvFN32duLbXxyE06qLFi9jcd0HwfODkQ0QMtvvuM60+i7pHa+JQ75MStWHpj1DIaoA== +broccoli-funnel@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.5.tgz#60da33d060fae2936b3d78217bd4008a6eea5e41" + integrity sha512-fcjvQIWq4lpKyzQ7FWRo/V8/nOALjIrAoRMFCLgFeO2xhOC1+i7QWbMndLTwpnLCoXpTa+luBu3WSFoxQ3VPlw== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" - broccoli-plugin "^4.0.1" + broccoli-plugin "^4.0.7" debug "^4.1.1" fast-ordered-set "^1.0.0" fs-tree-diff "^2.0.1" @@ -4106,7 +4106,7 @@ broccoli-output-wrapper@^2.0.0: dependencies: heimdalljs-logger "^0.1.10" -broccoli-output-wrapper@^3.2.1: +broccoli-output-wrapper@^3.2.1, broccoli-output-wrapper@^3.2.5: version "3.2.5" resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.5.tgz#514b17801c92922a2c2f87fd145df2a25a11bc5f" integrity sha512-bQAtwjSrF4Nu0CK0JOy5OZqw9t5U0zzv2555EA/cF8/a8SLDTIetk9UgrtMVw7qKLKdSpOZ2liZNeZZDaKgayw== @@ -4217,6 +4217,19 @@ broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli rimraf "^3.0.0" symlink-or-copy "^1.3.0" +broccoli-plugin@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" + integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-output-wrapper "^3.2.5" + fs-merger "^3.2.1" + promise-map-series "^0.3.0" + quick-temp "^0.1.8" + rimraf "^3.0.2" + symlink-or-copy "^1.3.1" + broccoli-postcss-single@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/broccoli-postcss-single/-/broccoli-postcss-single-4.0.1.tgz#21f1494826058c974fd746bba7d10976d9cce26d" @@ -8769,6 +8782,17 @@ fs-merger@^3.0.1, fs-merger@^3.1.0: rimraf "^2.6.3" walk-sync "^2.0.2" +fs-merger@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" + integrity sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-node-info "^2.1.0" + fs-extra "^8.0.1" + fs-tree-diff "^2.0.1" + walk-sync "^2.2.0" + fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" From bde6bc9c8b2dc05b265aef8cccd9b33557df6810 Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 4 May 2021 11:21:35 +0400 Subject: [PATCH 0182/3032] Enabled "emails" limit configuration refs https://github.com/TryGhost/Team/issues/588 refs https://github.com/TryGhost/Ghost/commit/a83cccd84bf11d1cc283f4afa9de763fd78774c1 - This bump allows to pass configuration for "emails" limit (flag type for now) and allows to do checks against this limit as a consequence - Useful to be able to do basic checks for newsletter-related functionality - It's a symmetric change to the server-side one --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index fb5a4daf63..86c2e5eb53 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@tryghost/helpers": "1.1.43", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", - "@tryghost/limit-service": "0.4.2", + "@tryghost/limit-service": "0.4.3", "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.18", diff --git a/yarn.lock b/yarn.lock index 648cdf7c78..6d58d3cec5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1998,10 +1998,10 @@ dependencies: "@tryghost/kg-clean-basic-html" "^1.0.17" -"@tryghost/limit-service@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-0.4.2.tgz#3f096d3f0b158ffb51411cb7f0f772fd216c5fce" - integrity sha512-bFT2nsLVJdfIKirHsLEoZk2ZDF9Gx0tSJomfoDRyc5iGnI7Vgy3FTemlAXjM50NfFH1VCFBZiH81QeoTxa7vbw== +"@tryghost/limit-service@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-0.4.3.tgz#2594941c14b14fc9e99846a13fd218ecbbe253b3" + integrity sha512-ZdiT5irH6+EUXKw/8ie9CccDfhpS6CbnW0WtzvLbHWP7nPfbZ2iXasmdhNYugHeWHJcZyW41CrKBM/qIxvDUNQ== dependencies: lodash "^4.17.21" From 16fb465b10537c76460bd2fe6d8463f2e8f7b374 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Tue, 4 May 2021 11:55:33 +0100 Subject: [PATCH 0183/3032] v4.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 86c2e5eb53..aebe1066aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.3.3", + "version": "4.4.0", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 120d8e2eeb887613eedd33613dd47367f3217b39 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 4 May 2021 21:13:31 +0530 Subject: [PATCH 0184/3032] Handled custom prices in portal settings refs https://github.com/TryGhost/Team/issues/637 Updates Portal settings to use list of custom prices for default product instead of hardcoded Monthly/Yearly --- app/components/modal-portal-settings.hbs | 61 +++++++++--------------- app/components/modal-portal-settings.js | 29 ++++++++++- app/services/members-utils.js | 5 ++ 3 files changed, 55 insertions(+), 40 deletions(-) diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index c46f1073c8..34ecf7aee7 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -53,44 +53,29 @@

    Free

    -
    - -
    -
    - -
    + {{#if this.prices}} + {{#each this.filteredPrices as |price|}} +
    + +
    + {{/each}} + {{/if}} {{else}}
    diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index 3a81dc2c2b..4ef0e21c6d 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -36,6 +36,7 @@ export default ModalComponent.extend({ config: service(), membersUtils: service(), settings: service(), + store: service(), page: 'signup', iconExtensions: null, @@ -46,11 +47,24 @@ export default ModalComponent.extend({ showLeaveSettingsModal: false, freeSignupRedirect: undefined, paidSignupRedirect: undefined, + prices: null, confirm() {}, isStripeConfigured: reads('membersUtils.isStripeEnabled'), + filteredPrices: computed('prices', 'settings.portalPlans.[]', function () { + const portalPlans = this.get('settings.portalPlans'); + return this.prices.filter((d) => { + return d.amount !== 0 && d.type === 'recurring'; + }).map((price) => { + return { + ...price, + checked: !!portalPlans.find(d => d === price.id) + }; + }); + }), + buttonIcon: computed('settings.portalButtonIcon', function () { const defaultIconKeys = this.defaultButtonIcons.map(buttonIcon => buttonIcon.value); return (this.settings.get('portalButtonIcon') || defaultIconKeys[0]); @@ -68,8 +82,9 @@ export default ModalComponent.extend({ return `data-portal`; }), - portalPreviewUrl: computed('buttonIcon', 'page', 'isFreeChecked', 'isMonthlyChecked', 'isYearlyChecked', 'settings.{portalName,portalButton,portalButtonSignupText,portalButtonStyle,accentColor}', function () { + portalPreviewUrl: computed('buttonIcon', 'page', 'isFreeChecked', 'isMonthlyChecked', 'isYearlyChecked', 'settings.{portalName,portalButton,portalButtonSignupText,portalButtonStyle,accentColor,portalPlans.[]}', function () { const options = this.getProperties(['buttonIcon', 'page', 'isFreeChecked', 'isMonthlyChecked', 'isYearlyChecked']); + options.portalPlans = this.get('settings.portalPlans'); return this.membersUtils.getPortalPreviewUrl(options); }), @@ -119,7 +134,7 @@ export default ModalComponent.extend({ if (portalButtonIcon && !defaultIconKeys.includes(portalButtonIcon)) { this.set('customIcon', this.settings.get('portalButtonIcon')); } - + this.getAvailablePrices.perform(); this.siteUrl = this.config.get('blogUrl'); }, @@ -141,6 +156,9 @@ export default ModalComponent.extend({ toggleYearlyPlan(isChecked) { this.updateAllowedPlan('yearly', isChecked); }, + togglePlan(priceId, event) { + this.updateAllowedPlan(priceId, event.target.checked); + }, togglePortalButton(showButton) { this.settings.set('portalButton', showButton); }, @@ -297,5 +315,12 @@ export default ModalComponent.extend({ } yield this.settings.save(); this.closeModal(); + }).drop(), + + getAvailablePrices: task(function* () { + const products = yield this.store.query('product', {include: 'stripe_prices'}); + const product = products.firstObject; + const prices = product.get('stripePrices'); + this.set('prices', prices); }).drop() }); diff --git a/app/services/members-utils.js b/app/services/members-utils.js index 752a2ce03e..c47ce3dca3 100644 --- a/app/services/members-utils.js +++ b/app/services/members-utils.js @@ -28,6 +28,7 @@ export default class MembersUtilsService extends Service { isYearlyChecked = true, monthlyPrice, yearlyPrice, + portalPlans, currency } = args; @@ -53,6 +54,10 @@ export default class MembersUtilsService extends Service { settingsParam.append('signupButtonText', encodeURIComponent(signupButtonText)); settingsParam.append('allowSelfSignup', allowSelfSignup); + if (portalPlans) { + settingsParam.append('portalPrices', encodeURIComponent(portalPlans)); + } + if (this.settings.get('accentColor') === '' || this.settings.get('accentColor')) { settingsParam.append('accentColor', encodeURIComponent(`${this.settings.get('accentColor')}`)); } From 50035e4f460e817addac050e488ed318f39dc82a Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 4 May 2021 21:17:50 +0530 Subject: [PATCH 0185/3032] Updated launch wizard to create custom price refs https://github.com/TryGhost/Team/issues/644 Updates site setup to create custom Monthly/Yearly prices in default product as part of launch wizard. Also updates available portal plans based on user selection. --- app/components/gh-launch-wizard/finalise.js | 23 ++ .../gh-launch-wizard/set-pricing.hbs | 25 ++- .../gh-launch-wizard/set-pricing.js | 212 +++++++++--------- app/controllers/launch.js | 11 + app/templates/launch.hbs | 2 + 5 files changed, 158 insertions(+), 115 deletions(-) diff --git a/app/components/gh-launch-wizard/finalise.js b/app/components/gh-launch-wizard/finalise.js index ee9ab00db6..b7436f94c9 100644 --- a/app/components/gh-launch-wizard/finalise.js +++ b/app/components/gh-launch-wizard/finalise.js @@ -7,9 +7,32 @@ export default class GhLaunchWizardFinaliseComponent extends Component { @service feature; @service notifications; @service router; + @service settings; + + willDestroy() { + // clear any unsaved settings changes when going back/forward/closing + this.settings.rollbackAttributes(); + } @task *finaliseTask() { + const data = this.args.getData(); + if (data && data.product) { + const updatedProduct = yield data.product.save(); + const monthlyPrice = updatedProduct.get('stripePrices').find(d => d.nickname === 'Monthly'); + const yearlyPrice = updatedProduct.get('stripePrices').find(d => d.nickname === 'Yearly'); + const portalPlans = this.settings.get('portalPlans') || []; + let allowedPlans = [...portalPlans]; + if (data.isMonthlyChecked && monthlyPrice) { + allowedPlans.push(monthlyPrice.id); + } + + if (data.isYearlyChecked && yearlyPrice) { + allowedPlans.push(yearlyPrice.id); + } + this.settings.set('portalPlans', allowedPlans); + yield this.settings.save(); + } yield this.feature.set('launchComplete', true); this.router.transitionTo('dashboard'); this.notifications.showNotification( diff --git a/app/components/gh-launch-wizard/set-pricing.hbs b/app/components/gh-launch-wizard/set-pricing.hbs index 63f4ace1e2..0adc3fb654 100644 --- a/app/components/gh-launch-wizard/set-pricing.hbs +++ b/app/components/gh-launch-wizard/set-pricing.hbs @@ -6,6 +6,7 @@
    Plan currency
    - +
    Monthly price
    - {{this.stripePlans.monthly.currency}}/month + {{this.currency}}/month
    - +
    Yearly price
    - {{this.stripePlans.yearly.currency}}/year + {{this.currency}}/year
    - + {{#if this.stripePlanError}} +

    {{this.stripePlanError}}

    + {{/if}}
    @@ -66,7 +71,7 @@ checked={{this.isFreeChecked}} id="free-plan" name="free-plan" - disabled={{not (eq this.settings.membersSignupAccess "all")}} + disabled={{this.isFreeDisabled}} class="gh-input post-settings-featured" {{on "click" this.toggleFreePlan}} data-test-checkbox="featured" @@ -85,7 +90,7 @@ id="monthly-plan" name="monthly-plan" checked={{this.isMonthlyChecked}} - disabled={{not this.membersUtils.isStripeEnabled}} + disabled={{this.isPaidPriceDisabled}} class="gh-input post-settings-featured" {{on "click" this.toggleMonthlyPlan}} data-test-checkbox="featured" @@ -104,7 +109,7 @@ id="yearly-plan" name="yearly-plan" checked={{this.isYearlyChecked}} - disabled={{not this.membersUtils.isStripeEnabled}} + disabled={{this.isPaidPriceDisabled}} class="gh-input post-settings-featured" {{on "click" this.toggleYearlyPlan}} data-test-checkbox="featured" diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index 338035ee41..88af4d30ca 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -1,6 +1,6 @@ import Component from '@glimmer/component'; import {action} from '@ember/object'; -import {currencies} from 'ghost-admin/utils/currency'; +import {currencies, getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; import {tracked} from '@glimmer/tracking'; @@ -17,145 +17,111 @@ export default class GhLaunchWizardSetPricingComponent extends Component { @service config; @service membersUtils; @service settings; + @service store; currencies = CURRENCIES; - @tracked stripeMonthlyAmount = null; - @tracked stripeYearlyAmount = null; - - get stripePlans() { - const plans = this.settings.get('stripePlans') || []; - const monthly = plans.find(plan => plan.interval === 'month'); - const yearly = plans.find(plan => plan.interval === 'year' && plan.name !== 'Complimentary'); - - return { - monthly: { - amount: (parseInt(monthly?.amount) || 0) / 100 || 5, - currency: monthly?.currency || this.currencies[0].value - }, - yearly: { - amount: (parseInt(yearly?.amount) || 0) / 100 || 50, - currency: yearly?.currency || this.currencies[0].value - } - }; - } + @tracked stripeMonthlyAmount = 5; + @tracked stripeYearlyAmount = 50; + @tracked currency = 'usd'; + @tracked isFreeChecked = true; + @tracked isMonthlyChecked = true; + @tracked isYearlyChecked = true; + @tracked stripePlanError = ''; + @tracked product; get selectedCurrency() { - return this.currencies.findBy('value', this.stripePlans.monthly.currency); + return this.currencies.findBy('value', this.currency); } - get isFreeChecked() { - const allowedPlans = this.settings.get('portalPlans') || []; - return (this.settings.get('membersSignupAccess') === 'all' && allowedPlans.includes('free')); + get disabled() { + if (this.product) { + return this.product.get('stripePrices') && this.product.get('stripePrices').length > 0; + } + return true; } - get isMonthlyChecked() { - const allowedPlans = this.settings.get('portalPlans') || []; - return (this.membersUtils.isStripeEnabled && allowedPlans.includes('monthly')); + get isPaidPriceDisabled() { + return this.disabled || !this.membersUtils.isStripeEnabled; } - get isYearlyChecked() { - const allowedPlans = this.settings.get('portalPlans') || []; - return (this.membersUtils.isStripeEnabled && allowedPlans.includes('yearly')); + get isFreeDisabled() { + return this.disabled || this.settings.get('membersSignupAccess') !== 'all'; } constructor() { super(...arguments); + const storedData = this.args.getData(); + if (storedData && storedData.product) { + this.updatePricesFromProduct(storedData.product); + } else { + this.stripeMonthlyAmount = 5; + this.stripeYearlyAmount = 50; + } this.updatePreviewUrl(); + this.fetchDefaultProduct(); + } + + updatePricesFromProduct(product) { + if (product) { + const prices = product.get('stripePrices') || []; + const monthlyPrice = prices.find(d => d.nickname === 'Monthly'); + const yearlyPrice = prices.find(d => d.nickname === 'Yearly'); + if (monthlyPrice && monthlyPrice.amount) { + this.stripeMonthlyAmount = (monthlyPrice.amount / 100); + this.currency = monthlyPrice.currency; + } + if (yearlyPrice && yearlyPrice.amount) { + this.stripeYearlyAmount = (yearlyPrice.amount / 100); + } + } } willDestroy() { // clear any unsaved settings changes when going back/forward/closing - this.settings.rollbackAttributes(); this.args.updatePreview(''); } @action setStripePlansCurrency(event) { const newCurrency = event.value; - - const updatedPlans = this.settings.get('stripePlans').map((plan) => { - if (plan.name !== 'Complimentary') { - return Object.assign({}, plan, { - currency: newCurrency - }); - } - return plan; - }); - - const currentComplimentaryPlan = updatedPlans.find((plan) => { - return plan.name === 'Complimentary' && plan.currency === event.value; - }); - - if (!currentComplimentaryPlan) { - updatedPlans.push({ - name: 'Complimentary', - currency: event.value, - interval: 'year', - amount: 0 - }); - } - - this.settings.set('stripePlans', updatedPlans); + this.currency = newCurrency; this.updatePreviewUrl(); } @action toggleFreePlan(event) { - this.updateAllowedPlan('free', event.target.checked); + this.isFreeChecked = event.target.checked; + this.updatePreviewUrl(); } @action toggleMonthlyPlan(event) { - this.updateAllowedPlan('monthly', event.target.checked); + this.isMonthlyChecked = event.target.checked; + this.updatePreviewUrl(); } @action toggleYearlyPlan(event) { - this.updateAllowedPlan('yearly', event.target.checked); + this.isYearlyChecked = event.target.checked; + this.updatePreviewUrl(); } @action validateStripePlans() { - this.settings.errors.remove('stripePlans'); - this.settings.hasValidated.removeObject('stripePlans'); - - if (this.stripeYearlyAmount === null) { - this.stripeYearlyAmount = this.stripePlans.yearly.amount; - } - if (this.stripeMonthlyAmount === null) { - this.stripeMonthlyAmount = this.stripePlans.monthly.amount; - } + this.stripePlanError = undefined; try { - const selectedCurrency = this.selectedCurrency; - const yearlyAmount = parseInt(this.stripeYearlyAmount); - const monthlyAmount = parseInt(this.stripeMonthlyAmount); + const yearlyAmount = this.stripeYearlyAmount; + const monthlyAmount = this.stripeMonthlyAmount; + const symbol = getSymbol(this.currency); if (!yearlyAmount || yearlyAmount < 1 || !monthlyAmount || monthlyAmount < 1) { - throw new TypeError(`Subscription amount must be at least ${selectedCurrency.symbol}1.00`); + throw new TypeError(`Subscription amount must be at least ${symbol}1.00`); } - const updatedPlans = this.settings.get('stripePlans').map((plan) => { - if (plan.name !== 'Complimentary') { - let newAmount; - if (plan.interval === 'year') { - newAmount = yearlyAmount * 100; - } else if (plan.interval === 'month') { - newAmount = monthlyAmount * 100; - } - return Object.assign({}, plan, { - amount: newAmount - }); - } - return plan; - }); - - this.settings.set('stripePlans', updatedPlans); this.updatePreviewUrl(); } catch (err) { - this.settings.errors.add('stripePlans', err.message); - } finally { - this.settings.hasValidated.pushObject('stripePlans'); + this.stripePlanError = err.message; } } @@ -163,34 +129,70 @@ export default class GhLaunchWizardSetPricingComponent extends Component { *saveAndContinue() { yield this.validateStripePlans(); - if (this.settings.errors.length > 0) { + if (this.stripePlanError) { return false; } - - yield this.settings.save(); + const product = this.getProduct(); + const data = this.args.getData() || {}; + this.args.storeData({ + ...data, + product, + isMonthlyChecked: this.isMonthlyChecked, + isYearlyChecked: this.isYearlyChecked + }); this.args.nextStep(); } - updateAllowedPlan(plan, isChecked) { - const portalPlans = this.settings.get('portalPlans') || []; - const allowedPlans = [...portalPlans]; - - if (!isChecked) { - this.settings.set('portalPlans', allowedPlans.filter(p => p !== plan)); - } else { - allowedPlans.push(plan); - this.settings.set('portalPlans', allowedPlans); + getProduct() { + if (this.product) { + const stripePrices = this.product.stripePrices || []; + if (stripePrices.length === 0 && this.stripeMonthlyAmount && this.stripeYearlyAmount) { + stripePrices.push( + { + nickname: 'Monthly', + amount: this.stripeMonthlyAmount * 100, + active: 1, + currency: this.currency, + interval: 'month', + type: 'recurring' + }, + { + nickname: 'Yearly', + amount: this.stripeYearlyAmount * 100, + active: 1, + currency: this.currency, + interval: 'month', + type: 'recurring' + } + ); + this.product.set('stripePrices', stripePrices); + return this.product; + } else { + return this.product; + } } + return null; + } - this.updatePreviewUrl(); + async fetchDefaultProduct() { + const products = await this.store.query('product', {include: 'stripe_prices'}); + this.product = products.firstObject; + if (this.product.get('stripePrices').length > 0) { + const data = this.args.getData() || {}; + this.args.storeData({ + ...data, + product: null + }); + this.args.nextStep(); + } } updatePreviewUrl() { const options = { disableBackground: true, currency: this.selectedCurrency.value, - monthlyPrice: this.stripePlans.monthly.amount, - yearlyPrice: this.stripePlans.yearly.amount, + monthlyPrice: this.stripeMonthlyAmount * 100, + yearlyPrice: this.stripeYearlyAmount * 100, isMonthlyChecked: this.isMonthlyChecked, isYearlyChecked: this.isYearlyChecked, isFreeChecked: this.isFreeChecked diff --git a/app/controllers/launch.js b/app/controllers/launch.js index f6a3c64dab..f36e40dbaf 100644 --- a/app/controllers/launch.js +++ b/app/controllers/launch.js @@ -13,6 +13,7 @@ export default class LaunchController extends Controller { @tracked previewGuid = (new Date()).valueOf(); @tracked previewSrc = ''; @tracked step = 'customise-design'; + @tracked data = null; steps = { 'customise-design': { @@ -46,6 +47,16 @@ export default class LaunchController extends Controller { return this.steps[this.step]; } + @action + storeData(data) { + this.data = data; + } + + @action + getData() { + return this.data; + } + @action goToStep(step) { if (step) { diff --git a/app/templates/launch.hbs b/app/templates/launch.hbs index 45770c97bb..20f234a9f4 100644 --- a/app/templates/launch.hbs +++ b/app/templates/launch.hbs @@ -18,6 +18,8 @@ refreshPreview=this.refreshPreview updatePreview=this.updatePreview replacePreviewContents=this.replacePreviewContents + storeData=this.storeData + getData=this.getData }}
    From e79f7f21ba0172514e5264861d35542586ed0481 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 4 May 2021 21:20:05 +0530 Subject: [PATCH 0186/3032] Added free membership settings modal refs https://github.com/TryGhost/Team/issues/648 All sites will include a default Free "Product" which is used for free memberships. This change adds UI for handling free membership settings. Also - - Updates product icons in list and responsive sizes - Copy updates --- app/components/gh-member-settings-form-cp.hbs | 137 +++++++++--------- .../modal-free-membership-settings.hbs | 61 ++++++++ .../modal-free-membership-settings.js | 24 +++ app/components/modal-product-price.hbs | 12 -- app/controllers/settings/products.js | 28 ++++ app/styles/layouts/members.css | 21 ++- app/styles/layouts/products.css | 67 +++++++-- app/templates/settings/products.hbs | 63 ++++---- 8 files changed, 290 insertions(+), 123 deletions(-) create mode 100644 app/components/modal-free-membership-settings.hbs create mode 100644 app/components/modal-free-membership-settings.js diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index 58ba76c13e..50db81002e 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -150,81 +150,74 @@ {{/if}}

    Products

    -
    -
      -
    1. -
      -
    2. - {{#unless this.products}} -
    3. -
      -
      This member doesn't have any products.
      - {{#unless this.member.isNew}} - - {{/unless}} -
      -
    4. + + {{#unless this.products}} +
      +
      +
      This member doesn't have any products.
      + {{#unless this.member.isNew}} + {{/unless}} - {{#each this.products as |product|}} -
    5. -
      -

      - {{product.name}} -

      - {{#each product.subscriptions as |sub|}} -
      - - +
      +
      + {{/unless}} -
      - Created on {{sub.startDate}} -
      - - View on Stripe - - - {{#if sub.cancel_at_period_end}} - - {{else}} - - {{/if}} -
      -
      -
    6. - {{/each}} + {{#each this.products as |product|}} +
      +
      +

      + {{product.name}} +

      + {{#each product.subscriptions as |sub|}} +
      +
      + {{sub.price.nickname}} + – + {{sub.price.currencySymbol}}{{sub.price.nonDecimalAmount}}/{{sub.price.interval}} + – + {{#if sub.cancel_at_period_end}} + Cancels {{sub.validUntil}} + Cancelled + {{else}} + Renews {{sub.validUntil}} + Active + {{/if}}
      - - {{/each}} - {{#if this.products}} - - - - - - {{/if}} -
    -
    +
    Created on {{sub.startDate}}
    + + + + + {{svg-jar "dotdotdot"}} + + + + +
  • + + View on Stripe + +
  • +
  • + {{#if sub.cancel_at_period_end}} + + {{else}} + + {{/if}} +
  • + + + + {{/each}} + + + {{/each}}
    diff --git a/app/components/modal-free-membership-settings.hbs b/app/components/modal-free-membership-settings.hbs new file mode 100644 index 0000000000..abed56159e --- /dev/null +++ b/app/components/modal-free-membership-settings.hbs @@ -0,0 +1,61 @@ + + + +
    + +
    + + \ No newline at end of file diff --git a/app/components/modal-free-membership-settings.js b/app/components/modal-free-membership-settings.js new file mode 100644 index 0000000000..3836215b32 --- /dev/null +++ b/app/components/modal-free-membership-settings.js @@ -0,0 +1,24 @@ +import ModalBase from 'ghost-admin/components/modal-base'; +import classic from 'ember-classic-decorator'; +import {action} from '@ember/object'; + +// TODO: update modals to work fully with Glimmer components +@classic +export default class ModalFreeMembershipSettings extends ModalBase { + init() { + super.init(...arguments); + } + + @action + close(event) { + event?.preventDefault?.(); + this.closeModal(); + } + + actions = { + // needed because ModalBase uses .send() for keyboard events + closeModal() { + this.close(); + } + } +} diff --git a/app/components/modal-product-price.hbs b/app/components/modal-product-price.hbs index 2bc67bdef2..d83d875875 100644 --- a/app/components/modal-product-price.hbs +++ b/app/components/modal-product-price.hbs @@ -71,18 +71,6 @@

    Advanced

    - {{!-- - -
    - - days -
    - -
    --}}
    -
    -
      -
    1. -
      -
      -
    2. - {{#each this.products as |product|}} -
    3. - -

      - {{product.name}} -

      -

      - Product description -

      -
      +
      +
      + {{svg-jar "members"}} +

      + Free membership +

      +

      + Product description +

      + + Customize + +
      - -
      - {{!-- 330 members --}} - {{svg-jar "arrow-right" class="w6 h6 fill-midgrey pa1"}} -
      -
      -
    4. - {{/each}} -
    -
    + {{#each this.products as |product|}} +
    +
    +

    + {{product.name}} +

    +

    + Product description +

    + + Customize + +
    + {{/each}} +
    - \ No newline at end of file + + +{{#if this.showFreeMembershipModal}} + +{{/if}} From 0c6dbeda82a8ff1b1cdeb7c9bf7fd1ba5809dec9 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 4 May 2021 21:52:14 +0530 Subject: [PATCH 0187/3032] Updated type attribute for dropdown button no refs The dropdown button component was missing `type="button"` when used as a button, which caused it to act like a `submit` button when used as part of a form, like in Member details page. This change adds type attribute to the button to fix the issue. --- app/components/gh-dropdown-button.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/components/gh-dropdown-button.js b/app/components/gh-dropdown-button.js index 500726d1d2..9c4ab854ef 100644 --- a/app/components/gh-dropdown-button.js +++ b/app/components/gh-dropdown-button.js @@ -1,17 +1,22 @@ import Component from '@ember/component'; import DropdownMixin from 'ghost-admin/mixins/dropdown-mixin'; +import {computed} from '@ember/object'; import {inject as service} from '@ember/service'; export default Component.extend(DropdownMixin, { dropdown: service(), tagName: 'button', - attributeBindings: ['href', 'role'], + attributeBindings: ['href', 'role', 'type'], role: 'button', // matches with the dropdown this button toggles dropdownName: null, + type: computed(function () { + return this.tagName === 'button' ? 'button' : null; + }), + // Notify dropdown service this dropdown should be toggled click(event) { this._super(event); From bdc6005ead2c2ddd99a01927fb4ff6b4bc284651 Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 4 May 2021 21:46:22 +0400 Subject: [PATCH 0188/3032] Added email limit check in post's publish menu refs https://github.com/TryGhost/Team/issues/588 - The change allows to give information about not being able to send a newsletter along with publishing the post instead of waiting for a server response to fail - Implements client-side limit check for email along with information coming from limit's error message --- app/components/gh-publishmenu-draft.hbs | 10 ++++--- app/components/gh-publishmenu-scheduled.hbs | 10 ++++--- app/components/gh-publishmenu.hbs | 8 ++++-- app/components/gh-publishmenu.js | 31 ++++++++++++++++++++- 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/app/components/gh-publishmenu-draft.hbs b/app/components/gh-publishmenu-draft.hbs index 9aec50e80a..67bd1902e3 100644 --- a/app/components/gh-publishmenu-draft.hbs +++ b/app/components/gh-publishmenu-draft.hbs @@ -34,6 +34,8 @@
    {{#if this.backgroundLoader.isRunning}}
    + {{else if this.isSendingEmailLimited}} +

    {{html-safe this.sendingEmailLimitError}}

    {{else}}
    @@ -43,8 +45,8 @@

    Free members {{this.freeMemberCountLabel}}

    + + {{#if (and this.canShowStripeInfo this.customer)}} +
    +

    Stripe customer

    +

    + {{#if this.customer.email}} + {{this.customer.email}} + {{else}} + No email + {{/if}} + – + + View on Stripe + +

    +
    + {{/if}}
    - {{#if this.canShowStripeInfo}} + {{!-- {{#if this.canShowStripeInfo}} {{#if this.customer}}

    Stripe info

    @@ -141,13 +158,11 @@
    {{/if}} - {{/if}} + {{/if}} --}}

    Products

    @@ -202,12 +217,12 @@
  • {{#if sub.cancel_at_period_end}} - {{else}} - {{/if}}
  • diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index 4399e40070..b2c0493d1f 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -554,11 +554,13 @@ textarea.gh-member-details-textarea { } .gh-member-stripe-info { - border-bottom: 1px solid var(--whitegrey); + margin-top: 24px; } -.gh-member-stripe-info:last-of-type { - border-bottom: none; +.gh-member-stripe-info p { + font-size: 1.25rem; + font-weight: 400; + margin: 4px 0 0; } .gh-member-stripe-table { @@ -1598,75 +1600,16 @@ p.gh-members-import-errordetail:first-of-type { color: var(--red); } -.gh-cp-memberproduct-showmore { - line-height: 1; - margin-top: 5px; -} - -.gh-cp-memberproduct-showmore label { - display: inline-block; - font-size: 1.3rem; - font-weight: 400; - line-height: 1.5em; - color: var(--middarkgrey); - margin: 4px 0 2px; - cursor: pointer; -} - -.gh-cp-memberproduct-showmore label:hover { - color: var(--darkgrey); -} - .gh-cp-memberproduct-pricelabel { font-weight: 600; } -.gh-cp-memberproduct-showmore label span.archived { +.gh-memberproduct-subscription span.archived { background: var(--lightgrey-l2); color: var(--midgrey); font-size: 1.2rem; } -.gh-cp-memberproduct-showmore label svg { - width: 9px; - height: 9px; - margin-right: 2px; -} - -.gh-cp-memberproduct-showmore label svg path { - fill: var(--midgrey); -} - -.gh-cp-memberproduct-showmore .details { - display: none; - flex-direction: column; - font-size: 1.3rem; - line-height: 1.7em; - color: var(--middarkgrey); - margin: 2px 0 16px 15px; -} - -.gh-cp-memberproduct-showmore .details .actions { - display: flex; - margin-top: 3px; -} - -.gh-cp-memberproduct-showmore .details .actions button span { - font-size: 1.3rem; -} - -.gh-cp-memberproduct-showmore input[type=checkbox] { - display: none; -} - -.gh-cp-memberproduct-showmore input[type=checkbox]:checked ~ .details { - display: flex; -} - -.gh-cp-memberproduct-showmore input[type=checkbox]:checked ~ label svg { - transform: rotate(90deg); -} - .gh-memberproduct-archived .gh-memberproduct-name { opacity: 0.5; } @@ -1728,10 +1671,10 @@ p.gh-members-import-errordetail:first-of-type { right: 0; } -.gh-memberproduct-subscription .action-menu .gh-btn span { +.gh-memberproduct-subscription .action-menu > .gh-btn span { height: 28px; } -.gh-memberproduct-subscription .action-menu .gh-btn svg { +.gh-memberproduct-subscription .action-menu > .gh-btn svg { margin: 0; } \ No newline at end of file From 71275966847be2442c45fe3d4755edd30f5059a4 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 5 May 2021 14:06:19 +0200 Subject: [PATCH 0194/3032] Refined product list on member details screen - updated subscription list for multiple subscriptions --- app/components/gh-member-settings-form-cp.hbs | 45 ------------------- app/styles/layouts/members.css | 12 ++++- 2 files changed, 11 insertions(+), 46 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index 31bc34a028..dd1efe952f 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -119,51 +119,6 @@
    - {{!-- {{#if this.canShowStripeInfo}} - {{#if this.customer}} -

    Stripe info

    -
    -
    -
    -
    - - - - - -
    Name: - {{#if this.customer.name}} - {{this.customer.name}} - {{else}} - No name - {{/if}} -
    -
    -
    -
    -
    - - - - - -
    Email: - {{#if this.customer.email}} - {{this.customer.email}} - {{else}} - No email - {{/if}} -
    -
    -
    -
    -
    - -
    -
    - {{/if}} - {{/if}} --}} -

    Products

    {{#unless this.products}} diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index b2c0493d1f..c1b592eb71 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1610,6 +1610,12 @@ p.gh-members-import-errordetail:first-of-type { font-size: 1.2rem; } +.gh-memberproduct-subscription:not(:first-of-type) { + margin-top: 12px; + padding-top: 12px; + border-top: 1px solid var(--whitegrey); +} + .gh-memberproduct-archived .gh-memberproduct-name { opacity: 0.5; } @@ -1667,10 +1673,14 @@ p.gh-members-import-errordetail:first-of-type { .gh-memberproduct-subscription .action-menu { position: absolute; - top: 0; + top: -4px; right: 0; } +.gh-memberproduct-subscription:not(:first-of-type) .action-menu { + top: 18px; +} + .gh-memberproduct-subscription .action-menu > .gh-btn span { height: 28px; } From fbbeeb20be36a1b678bd2744e336b5073a1ca47d Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 5 May 2021 15:03:17 +0200 Subject: [PATCH 0195/3032] Custom product cleanups - removed "New product" button - removed "Delete product" button --- app/templates/settings/product.hbs | 27 --------------------------- app/templates/settings/products.hbs | 3 --- 2 files changed, 30 deletions(-) diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index cc5aabff36..7f9ec11468 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -12,22 +12,6 @@ {{/if}}
    - - - - {{svg-jar "settings"}} - - - - -
  • - -
  • -
    -
    -
    - {{!--
    -

    Members

    -
    -
    CHART
    -
    -

    330

    -

    members have access to this product

    -
    - See members → -
    -
    --}} diff --git a/app/templates/settings/products.hbs b/app/templates/settings/products.hbs index db362d9f83..642168ce61 100644 --- a/app/templates/settings/products.hbs +++ b/app/templates/settings/products.hbs @@ -5,9 +5,6 @@ {{svg-jar "arrow-right"}} Products -
    - New product -
    From 1ecec3acf3f32651d21f65cdf1686cdc7fc9171e Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 5 May 2021 15:09:01 +0200 Subject: [PATCH 0196/3032] Product price cleanup - removed bottom block (welcome page and stripe checkout link) from price modal --- app/components/modal-product-price.hbs | 26 -------------------------- app/templates/settings/product.hbs | 10 +--------- 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/app/components/modal-product-price.hbs b/app/components/modal-product-price.hbs index 9c3d22de38..b955f121fc 100644 --- a/app/components/modal-product-price.hbs +++ b/app/components/modal-product-price.hbs @@ -8,7 +8,6 @@
    diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index 7f9ec11468..a31e5dd26f 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -120,14 +120,6 @@ {{#if this.showPriceModal}} - {{!-- - - --}} + @modifier="action wide product-ssprice" /> {{/if}} {{#if this.showUnsavedChangesModal}} From a6a7dfc942abdd068f4f6db68f5c7c10b7a09848 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 5 May 2021 15:23:44 +0200 Subject: [PATCH 0197/3032] Moved Stripe customer link to subscriptions - since there can be different Stripe customers for each subscription, it makes more sense to place the customer link together with it --- app/components/gh-member-settings-form-cp.hbs | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index dd1efe952f..854b9d04a0 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -99,23 +99,6 @@ - - {{#if (and this.canShowStripeInfo this.customer)}} -
    -

    Stripe customer

    -

    - {{#if this.customer.email}} - {{this.customer.email}} - {{else}} - No email - {{/if}} - – - - View on Stripe - -

    -
    - {{/if}} @@ -165,9 +148,15 @@ +
  • + + View Stripe customer + +
  • +
  • - View on Stripe + View Stripe subscription
  • From 8d2ec123741c86645b6dddb99984a9da2013a8f8 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Wed, 5 May 2021 14:27:44 +0100 Subject: [PATCH 0198/3032] =?UTF-8?q?=F0=9F=94=A5=20Dropped=20support=20fo?= =?UTF-8?q?r=20Node=2010?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Team/issues/658 - Node 10 become EOL as of April 30th so it's time to drop support - this commit removes the 10.x range from the `node` `engines` block --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9439010695..8ad820f4ef 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "lint:js": "eslint ." }, "engines": { - "node": "^10.13.0 || ^12.10.0 || ^14.15.0" + "node": "^12.10.0 || ^14.15.0" }, "devDependencies": { "@ember/jquery": "1.1.0", From 76d9f3233c3f4488cb127c4fde8d5f08957b77e8 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 5 May 2021 15:39:42 +0200 Subject: [PATCH 0199/3032] Added subscription count to member's product list no refs. - added subscription count to the product list in member details screen if there are multiple subscriptions for the given product. This is to make it clear and avoid confusion around the edge case when members have multiple subscriptions for the same product. --- app/components/gh-member-settings-form-cp.hbs | 7 +++++-- app/styles/layouts/members.css | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index 854b9d04a0..bf660ed77e 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -121,7 +121,10 @@

    - {{product.name}} + {{product.name}} + {{#unless (eq product.subscriptions.length 1 )}} + ({{product.subscriptions.length}} subscriptions) + {{/unless}}

    {{#each product.subscriptions as |sub|}}
    @@ -138,7 +141,7 @@ Active {{/if}}
    -
    Created on {{sub.startDate}}
    +
    Created on {{sub.startDate}}
    diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index c1b592eb71..5950bc68ed 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1616,6 +1616,10 @@ p.gh-members-import-errordetail:first-of-type { border-top: 1px solid var(--whitegrey); } +.gh-memberproduct-created { + margin-top: 1px; +} + .gh-memberproduct-archived .gh-memberproduct-name { opacity: 0.5; } @@ -1687,4 +1691,10 @@ p.gh-members-import-errordetail:first-of-type { .gh-memberproduct-subscription .action-menu > .gh-btn svg { margin: 0; +} + +.gh-memberproduct-subcount { + font-size: 1.4rem; + font-weight: 400; + color: var(--midgrey); } \ No newline at end of file From 8b6f2155ab4280001b68b236867a513b320ad68e Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 5 May 2021 15:58:47 +0200 Subject: [PATCH 0200/3032] Member product list cleanup --- app/components/gh-member-settings-form-cp.hbs | 6 +-- app/styles/layouts/members.css | 44 ++++++------------- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index bf660ed77e..6fc0cefa06 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -119,11 +119,11 @@ {{#each this.products as |product|}}
    -
    +

    {{product.name}} - {{#unless (eq product.subscriptions.length 1 )}} - ({{product.subscriptions.length}} subscriptions) + {{#unless (eq product.subscriptions.length 1)}} + {{product.subscriptions.length}} subscriptions {{/unless}}

    {{#each product.subscriptions as |sub|}} diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index 5950bc68ed..0c5127e7dd 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1568,36 +1568,24 @@ p.gh-members-import-errordetail:first-of-type { /* Member's product list */ .gh-memberproduct-name { + display: flex; + justify-content: space-between; font-size: 1.5rem; margin-bottom: 4px !important; } -.gh-memberproduct-actionlist { - display: flex; - align-items: center; - justify-content: flex-end; - width: 100%; - opacity: 0; -} - -.gh-memberproduct-list .gh-list-row:hover { - background: none !important; +.gh-cp-memberproduct.multiple-subs .gh-memberproduct-name { + margin-bottom: 8px !important; } -.gh-memberproduct-list .gh-list-row:hover .gh-memberproduct-actionlist { - opacity: 1; -} - -.gh-memberproduct-actionlist a, -.gh-memberproduct-actionlist button { - line-height: 0; - margin-left: 24px; - color: var(--darkgrey); - font-weight: 500; +.gh-memberproduct-subcount { + font-size: 1.25rem; + font-weight: 400; + color: var(--midgrey); } -.gh-memberproduct-actionlist button.archive { - color: var(--red); +.gh-memberproduct-list .gh-list-row:hover { + background: none !important; } .gh-cp-memberproduct-pricelabel { @@ -1610,7 +1598,7 @@ p.gh-members-import-errordetail:first-of-type { font-size: 1.2rem; } -.gh-memberproduct-subscription:not(:first-of-type) { +.gh-cp-memberproduct.multiple-subs .gh-memberproduct-subscription { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--whitegrey); @@ -1681,8 +1669,8 @@ p.gh-members-import-errordetail:first-of-type { right: 0; } -.gh-memberproduct-subscription:not(:first-of-type) .action-menu { - top: 18px; +.gh-cp-memberproduct.multiple-subs .gh-memberproduct-subscription .action-menu { + top: 20px; } .gh-memberproduct-subscription .action-menu > .gh-btn span { @@ -1691,10 +1679,4 @@ p.gh-members-import-errordetail:first-of-type { .gh-memberproduct-subscription .action-menu > .gh-btn svg { margin: 0; -} - -.gh-memberproduct-subcount { - font-size: 1.4rem; - font-weight: 400; - color: var(--midgrey); } \ No newline at end of file From f80f286dbb19724d002955144e9bab65caf166ab Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Wed, 5 May 2021 17:33:59 +0200 Subject: [PATCH 0201/3032] Updated metadata description preview cutoff point across admin --- app/components/gh-post-settings-menu.hbs | 4 ++-- app/components/modal-post-preview/social.hbs | 2 +- app/styles/layouts/post-preview.css | 3 --- app/templates/settings/general.hbs | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/components/gh-post-settings-menu.hbs b/app/components/gh-post-settings-menu.hbs index 7e18f1cb11..cf8212215e 100644 --- a/app/components/gh-post-settings-menu.hbs +++ b/app/components/gh-post-settings-menu.hbs @@ -215,7 +215,7 @@ @focus-out={{action "setMetaDescription" this.metaDescriptionScratch}} @stopEnterKeyDownPropagation="true" data-test-field="meta-description" /> -

    Recommended: 156 characters. You’ve used {{gh-count-down-characters this.metaDescriptionScratch 156}}

    +

    Recommended: 145 characters. You’ve used {{gh-count-down-characters this.metaDescriptionScratch 145}}

    @@ -242,7 +242,7 @@
    {{truncate this.seoTitle 60}}
    -
    {{this.seoDescription}}
    +
    {{moment-format (now) "DD MMM YYYY"}} — {{truncate this.seoDescription 149}}
    diff --git a/app/components/modal-post-preview/social.hbs b/app/components/modal-post-preview/social.hbs index cb04bf0274..ae89e2e123 100644 --- a/app/components/modal-post-preview/social.hbs +++ b/app/components/modal-post-preview/social.hbs @@ -249,7 +249,7 @@ >{{@post.metaDescription}} {{else}}
    - {{moment-format (now) "DD MMM YYYY"}} — {{truncate this.serpDescription 170}} + {{moment-format (now) "DD MMM YYYY"}} — {{truncate this.serpDescription 149}}
    {{/if}}
    diff --git a/app/styles/layouts/post-preview.css b/app/styles/layouts/post-preview.css index f6f35bc75d..f122e0da72 100644 --- a/app/styles/layouts/post-preview.css +++ b/app/styles/layouts/post-preview.css @@ -639,14 +639,11 @@ } .gh-seo-preview-desc { - max-height: 45px; - overflow: hidden; color: #4d5156; font-family: Arial, sans-serif; font-size: 14px; line-height: 22px; font-weight: 400; - text-overflow: ellipsis; } .gh-seo-preview-desc.editable:hover { diff --git a/app/templates/settings/general.hbs b/app/templates/settings/general.hbs index 1fe8df4efb..e70d3272c9 100644 --- a/app/templates/settings/general.hbs +++ b/app/templates/settings/general.hbs @@ -160,7 +160,7 @@
    {{or this.settings.metaTitle this.settings.title}}
    - {{moment-format (now) "DD MMM YYYY"}} — {{truncate (or this.settings.metaDescription this.settings.description) 170}} + {{truncate (or this.settings.metaDescription this.settings.description) 159}}
    From e117aff679c945280c40d7f79f871f28accda124 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 5 May 2021 15:13:15 +0000 Subject: [PATCH 0202/3032] Update dependency fs-extra to v10 --- package.json | 2 +- yarn.lock | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 8ad820f4ef..9fe7e13670 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "eslint": "7.25.0", "eslint-plugin-ghost": "2.1.0", "faker": "5.5.3", - "fs-extra": "9.1.0", + "fs-extra": "10.0.0", "glob": "7.1.6", "google-caja-bower": "https://github.com/acburdine/google-caja-bower#ghost", "grunt": "1.4.0", diff --git a/yarn.lock b/yarn.lock index f61d6eb181..dfaba9a539 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8666,12 +8666,11 @@ from2@^2.1.0, from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== +fs-extra@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== dependencies: - at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" From d2e08f2431cf06f5b4fbbae5e084952593cdccc2 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 5 May 2021 17:46:42 +0200 Subject: [PATCH 0203/3032] Member activity list refinements --- app/components/gh-member-activity-feed.hbs | 2 +- app/styles/layouts/members.css | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/components/gh-member-activity-feed.hbs b/app/components/gh-member-activity-feed.hbs index 5be2dee39f..104550203a 100644 --- a/app/components/gh-member-activity-feed.hbs +++ b/app/components/gh-member-activity-feed.hbs @@ -15,7 +15,7 @@ {{#if (and this.remainingActivities (not this.isShowingAll))}}
  • -{{#if this.showLeaveSettingsModal}} - -{{/if}} - {{#if this.showEmailDesignSettings}} { + if (transition.to.queryParams?.fromAddressUpdate === 'success') { + this.notifications.showAlert( + `Newsletter email address has been updated`.htmlSafe(), + {type: 'success', key: 'members.settings.from-address.updated'} + ); + } else if (transition.to.queryParams?.supportAddressUpdate === 'success') { + this.notifications.showAlert( + `Support email address has been updated`.htmlSafe(), + {type: 'success', key: 'members.settings.support-address.updated'} + ); + } + }); }, model() { @@ -26,22 +31,12 @@ export default AuthenticatedRoute.extend(CurrentUserSettings, { }, setupController(controller) { - if (controller.fromAddressUpdate === 'success') { - this.notifications.showAlert( - `Newsletter email address has been updated`.htmlSafe(), - {type: 'success', key: 'members.settings.from-address.updated'} - ); - } else if (controller.supportAddressUpdate === 'success') { - this.notifications.showAlert( - `Support email address has been updated`.htmlSafe(), - {type: 'success', key: 'members.settings.support-address.updated'} - ); - } + controller.resetEmailAddresses(); }, - resetController(controller, isExiting) { - if (isExiting) { - controller.reset(); + actions: { + willTransition(transition) { + return this.controller.leaveRoute(transition); } }, diff --git a/app/templates/settings/members-email.hbs b/app/templates/settings/members-email.hbs index 85c185730a..170f349478 100644 --- a/app/templates/settings/members-email.hbs +++ b/app/templates/settings/members-email.hbs @@ -24,10 +24,19 @@ @settings={{this.settings}} @fromAddress={{this.fromAddress}} @supportAddress={{this.supportAddress}} - @setEmailAddress={{action "setEmailAddress"}} + @setEmailAddress={{this.setEmailAddress}} /> {{/if}} + + {{#if this.showLeaveSettingsModal}} + + {{/if}} \ No newline at end of file From b37bd650f5bc3156bdb52a8c94439da502641935 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Thu, 6 May 2021 17:55:16 +0530 Subject: [PATCH 0205/3032] Fixed paid signup input in portal setting refs https://github.com/TryGhost/Team/issues/637 The paid signup setting was incorrectly still checking only for Monthly and yearly prices instead of custom prices list to show the paid signup input. --- app/components/modal-portal-settings.hbs | 2 +- app/components/modal-portal-settings.js | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index 34ecf7aee7..a957e93157 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -221,7 +221,7 @@ />

    Redirect to this URL after free signup

    - {{#if (and this.isStripeConfigured (or this.isMonthlyChecked this.isYearlyChecked))}} + {{#if (and this.isStripeConfigured hasPaidPriceChecked)}} { + const prices = this.prices || []; + return prices.filter((d) => { return d.amount !== 0 && d.type === 'recurring'; }).map((price) => { return { @@ -65,6 +66,16 @@ export default ModalComponent.extend({ }); }), + hasPaidPriceChecked: computed('prices', 'settings.portalPlans.[]', function () { + const portalPlans = this.get('settings.portalPlans'); + const prices = this.prices || []; + return prices.filter((d) => { + return d.amount !== 0 && d.type === 'recurring'; + }).some((price) => { + return !!portalPlans.find(d => d === price.id); + }); + }), + buttonIcon: computed('settings.portalButtonIcon', function () { const defaultIconKeys = this.defaultButtonIcons.map(buttonIcon => buttonIcon.value); return (this.settings.get('portalButtonIcon') || defaultIconKeys[0]); From 8bc50c1d8ba01db1b05bf83eedceaec742e15eac Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 6 May 2021 17:11:09 +0200 Subject: [PATCH 0206/3032] Updated member detail screen for custom products - added "Add subscription" button to product list - copy updates --- app/components/gh-member-settings-form-cp.hbs | 12 +++++++--- app/components/modal-member-product.hbs | 22 ++++--------------- app/components/modal-product-price.hbs | 2 +- app/styles/layouts/members.css | 14 +++++++++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index 6fc0cefa06..b408aec9f2 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -102,15 +102,15 @@ -

    Products

    +

    Subscriptions

    {{#unless this.products}}
    -
    This member doesn't have any products.
    +
    This member doesn't have any subscriptions.
    {{#unless this.member.isNew}} {{/unless}}
    @@ -177,6 +177,12 @@
    {{/each}} + + {{/each}} diff --git a/app/components/modal-member-product.hbs b/app/components/modal-member-product.hbs index b7d2c9f422..5503ad9da9 100644 --- a/app/components/modal-member-product.hbs +++ b/app/components/modal-member-product.hbs @@ -1,13 +1,9 @@ -{{!-- --}}
    -
    - 0 -
    -
    + +
    + {{#liquid-if @expanded}} +
    +
    +
    +
    +
    +
    Disabled
    +
    +
    +
    +
    +
    +
    Match post access level
    +
    +
    +
    +
    +
    +
    Nobody
    +
    +
    +
    +
    +
    +
    All members
    +
    +
    +
    +
    +
    +
    Free members
    +
    +
    +
    +
    +
    +
    Paid members
    +
    +
    +
    +
    + {{/liquid-if}} +
    +
    \ No newline at end of file diff --git a/app/components/settings/default-email-recipients.js b/app/components/settings/default-email-recipients.js new file mode 100644 index 0000000000..c2c15d13e2 --- /dev/null +++ b/app/components/settings/default-email-recipients.js @@ -0,0 +1,88 @@ +import Component from '@glimmer/component'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {tracked} from '@glimmer/tracking'; + +export default class SettingsDefaultEmailRecipientsComponent extends Component { + @service settings; + + @tracked segmentSelected = false; + + get isDisabled() { + return this.settings.get('membersSignupAccess') === 'none'; + } + + get isDisabledSelected() { + return this.isDisabled || + this.settings.get('editorDefaultEmailRecipients') === 'disabled'; + } + + get isVisibilitySelected() { + return !this.isDisabled && + this.settings.get('editorDefaultEmailRecipients') === 'visibility'; + } + + get isNobodySelected() { + return !this.isDisabled && + !this.segmentSelected && + this.settings.get('editorDefaultEmailRecipients') === 'filter' && + this.settings.get('editorDefaultEmailRecipientsFilter') === null; + } + + get isAllSelected() { + return !this.isDisabled && + !this.segmentSelected && + this.settings.get('editorDefaultEmailRecipients') === 'filter' && + this.settings.get('editorDefaultEmailRecipientsFilter') === 'status:free,status:-free'; + } + + get isFreeSelected() { + return !this.isDisabled && + !this.segmentSelected && + this.settings.get('editorDefaultEmailRecipients') === 'filter' && + this.settings.get('editorDefaultEmailRecipientsFilter') === 'status:free'; + } + + get isPaidSelected() { + return !this.isDisabled && + !this.segmentSelected && + this.settings.get('editorDefaultEmailRecipients') === 'filter' && + this.settings.get('editorDefaultEmailRecipientsFilter') === 'status:-free'; + } + + get isSegmentSelected() { + const isCustomSegment = this.settings.get('editorDefaultEmailRecipients') === 'filter' && + !this.isNobodySelected && + !this.isAllSelected && + !this.isFreeSelected && + !this.isPaidSelected; + + return !this.isDisabled && (this.segmentSelected || isCustomSegment); + } + + @action + setDefaultEmailRecipients(value) { + if (['disabled', 'visibility'].includes(value)) { + this.settings.set('editorDefaultEmailRecipients', value); + return; + } + + if (value === 'none') { + this.settings.set('editorDefaultEmailRecipientsFilter', null); + } + + if (value === 'all') { + this.settings.set('editorDefaultEmailRecipientsFilter', 'status:free,status:-free'); + } + + if (value === 'free') { + this.settings.set('editorDefaultEmailRecipientsFilter', 'status:free'); + } + + if (value === 'paid') { + this.settings.set('editorDefaultEmailRecipientsFilter', 'status:-free'); + } + + this.settings.set('editorDefaultEmailRecipients', 'filter'); + } +} diff --git a/app/controllers/settings/members-access.js b/app/controllers/settings/members-access.js index 28689eb06a..7f7052f36f 100644 --- a/app/controllers/settings/members-access.js +++ b/app/controllers/settings/members-access.js @@ -7,6 +7,8 @@ import {tracked} from '@glimmer/tracking'; export default class MembersAccessController extends Controller { @service settings; + queryParams = ['signupAccessOpen', 'postAccessOpen'] + @tracked showLeaveSettingsModal = false; @tracked signupAccessOpen = false; @tracked postAccessOpen = false; diff --git a/app/controllers/settings/members-email.js b/app/controllers/settings/members-email.js index c740456e16..54ff546c64 100644 --- a/app/controllers/settings/members-email.js +++ b/app/controllers/settings/members-email.js @@ -9,11 +9,14 @@ export default class MembersEmailController extends Controller { @service session; @service settings; + queryParams = ['emailRecipientsOpen'] + // from/supportAddress are set here so that they can be reset to saved values on save // to avoid it looking like they've been saved when they have a separate update process @tracked fromAddress = ''; @tracked supportAddress = ''; + @tracked emailRecipientsOpen = false; @tracked showLeaveSettingsModal = false; @action @@ -21,6 +24,11 @@ export default class MembersEmailController extends Controller { this[property] = email; } + @action + toggleEmailRecipientsOpen() { + this.emailRecipientsOpen = !this.emailRecipientsOpen; + } + leaveRoute(transition) { if (this.settings.get('hasDirtyAttributes')) { transition.abort(); diff --git a/app/models/setting.js b/app/models/setting.js index 86f3b98584..b84f0367d1 100644 --- a/app/models/setting.js +++ b/app/models/setting.js @@ -1,6 +1,7 @@ /* eslint-disable camelcase */ import Model, {attr} from '@ember-data/model'; import ValidationEngine from 'ghost-admin/mixins/validation-engine'; +import {and} from '@ember/object/computed'; export default Model.extend(ValidationEngine, { validationType: 'setting', @@ -51,8 +52,8 @@ export default Model.extend(ValidationEngine, { /** * Members settings */ - defaultContentVisibility: attr('string'), membersSignupAccess: attr('string'), + defaultContentVisibility: attr('string'), membersFromAddress: attr('string'), membersSupportAddress: attr('string'), membersReplyAddress: attr('string'), @@ -79,5 +80,12 @@ export default Model.extend(ValidationEngine, { * OAuth settings */ oauthClientId: attr('string'), - oauthClientSecret: attr('string') + oauthClientSecret: attr('string'), + /** + * Editor settings + */ + editorDefaultEmailRecipients: attr('string'), + editorDefaultEmailRecipientsFilter: attr('members-segment-string'), + + mailgunIsConfigured: and('mailgunApiKey', 'mailgunDomain', 'mailgunBaseUrl') }); diff --git a/app/services/settings.js b/app/services/settings.js index 1028652b02..f4007bf14d 100644 --- a/app/services/settings.js +++ b/app/services/settings.js @@ -27,7 +27,7 @@ export default Service.extend(_ProxyMixin, ValidationEngine, { _loadSettings() { if (!this._loadingPromise) { this._loadingPromise = this.store - .queryRecord('setting', {group: 'site,theme,private,members,portal,newsletter,email,amp,labs,slack,unsplash,views,firstpromoter,oauth'}) + .queryRecord('setting', {group: 'site,theme,private,members,portal,newsletter,email,amp,labs,slack,unsplash,views,firstpromoter,oauth,editor'}) .then((settings) => { this._loadingPromise = null; return settings; diff --git a/app/styles/components/power-select.css b/app/styles/components/power-select.css index c47755de09..0c9699b8bc 100644 --- a/app/styles/components/power-select.css +++ b/app/styles/components/power-select.css @@ -256,6 +256,18 @@ fill: var(--black); } +/* Segment input */ + +.token-segment-status { + background: color-mod(var(--blue) alpha(0.1)); + color: var(--blue); +} + +.token-segment-status svg path { + stroke: var(--blue); + fill: var(--blue); +} + /* Inside settings / Mailgun region */ /* TODO: make these general styles? */ diff --git a/app/templates/editor.hbs b/app/templates/editor.hbs index f0daeda95e..4df971397c 100644 --- a/app/templates/editor.hbs +++ b/app/templates/editor.hbs @@ -50,7 +50,6 @@ @saveTask={{this.save}} @setSaveType={{action "setSaveType"}} @onOpen={{action "cancelAutosave"}} - @backgroundTask={{this.backgroundLoader}} @memberCount={{this.memberCount}} />
    {{/if}} diff --git a/app/templates/settings/members-email.hbs b/app/templates/settings/members-email.hbs index 170f349478..7a112f3818 100644 --- a/app/templates/settings/members-email.hbs +++ b/app/templates/settings/members-email.hbs @@ -21,10 +21,11 @@ {{#if this.session.user.isOwner}}
    {{/if}} diff --git a/app/transforms/members-segment-string.js b/app/transforms/members-segment-string.js new file mode 100644 index 0000000000..365d5aa13d --- /dev/null +++ b/app/transforms/members-segment-string.js @@ -0,0 +1,29 @@ +import Transform from '@ember-data/serializer/transform'; + +// the members segment supports `'none'` and `'all'` as special-case options +// but that doesn't map well for options in our token select inputs so we +// expand/convert them here to make usage elsewhere easier + +export default class MembersSegmentStringTransform extends Transform { + deserialize(serialized) { + if (serialized === 'all') { + return 'status:free,status:-free'; + } + if (serialized === 'none') { + return null; + } + + return serialized; + } + + serialize(deserialized) { + if (deserialized === 'status:free,status:-free') { + return 'all'; + } + if (!deserialized) { + return 'none'; + } + + return deserialized; + } +} From d9f667737d1bb357748ea5cebc01a2553f48e47f Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 7 May 2021 14:34:43 +0530 Subject: [PATCH 0216/3032] Added home redirect for pricing wizard refs https://github.com/TryGhost/Team/issues/644 In case the prices are already set for the default product, its confusing to have the launch wizard show the price setup again. We remove the wizard completely if the prices are already created for the default product. --- app/components/gh-launch-wizard/set-pricing.js | 1 - app/controllers/dashboard.js | 18 ++++++++++++++++++ app/routes/launch.js | 7 +++++++ app/templates/dashboard.hbs | 2 +- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index 88af4d30ca..fb04c851e0 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -183,7 +183,6 @@ export default class GhLaunchWizardSetPricingComponent extends Component { ...data, product: null }); - this.args.nextStep(); } } diff --git a/app/controllers/dashboard.js b/app/controllers/dashboard.js index 63f734041e..06a500a5a2 100644 --- a/app/controllers/dashboard.js +++ b/app/controllers/dashboard.js @@ -2,6 +2,7 @@ import Controller from '@ember/controller'; import {action} from '@ember/object'; import {getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; import {tracked} from '@glimmer/tracking'; export default class DashboardController extends Controller { @@ -35,6 +36,7 @@ export default class DashboardController extends Controller { @tracked whatsNewEntries = null; @tracked whatsNewEntriesLoading = null; @tracked whatsNewEntriesError = null; + @tracked product = null; get topMembersDataHasOpenRates() { return this.topMembersData && this.topMembersData.find((member) => { @@ -47,12 +49,28 @@ export default class DashboardController extends Controller { } initialise() { + this.loadProducts.perform(); this.loadEvents(); this.loadTopMembers(); this.loadCharts(); this.loadWhatsNew(); } + get showLaunchWizard() { + const hasPrices = this.product && this.product.get('stripePrices').length > 0; + return !this.feature.launchComplete && !hasPrices; + } + + @task({drop: true}) + *loadProducts() { + try { + const products = yield this.store.query('product', {include: 'stripe_prices'}); + this.product = products.firstObject; + } catch (e) { + this.product = null; + } + } + loadMRRStats() { this.mrrStatsLoading = true; this.membersStats.fetchMRR().then((stats) => { diff --git a/app/routes/launch.js b/app/routes/launch.js index d2802cc24b..1e8013380e 100644 --- a/app/routes/launch.js +++ b/app/routes/launch.js @@ -6,10 +6,17 @@ export default class LaunchRoute extends AuthenticatedRoute { beforeModel() { super.beforeModel(...arguments); + return this.session.user.then((user) => { if (!user.isOwner) { return this.transitionTo('home'); } + this.store.query('product', {include: 'stripe_prices'}).then((products) => { + const defaultProduct = products.firstObject; + if (defaultProduct.get('stripePrices').length > 0) { + return this.transitionTo('home'); + } + }); }); } } diff --git a/app/templates/dashboard.hbs b/app/templates/dashboard.hbs index 3e0025c489..acb57fefd4 100644 --- a/app/templates/dashboard.hbs +++ b/app/templates/dashboard.hbs @@ -7,7 +7,7 @@
    - {{#if (and this.session.user.isOwner (not this.feature.launchComplete))}} + {{#if (and this.session.user.isOwner this.showLaunchWizard)}}

    Select your publication style

    From aef22ea5d0f3db91dc6b651fa40a6dfdf7f5ae50 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 7 May 2021 10:25:44 +0100 Subject: [PATCH 0217/3032] Hid segment count for non-admins refs https://github.com/TryGhost/Team/issues/496 refs https://github.com/TryGhost/Team/issues/581 Only owners and admins have browse access to members so they are the only ones able to fetch member counts. Don't render segment counts if there's no permission because we'll get errors back from the API and the count will be useless. --- app/components/gh-members-segment-count.hbs | 4 +++- app/components/gh-members-segment-count.js | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/components/gh-members-segment-count.hbs b/app/components/gh-members-segment-count.hbs index 94fbfb1f8b..3a9aad3acd 100644 --- a/app/components/gh-members-segment-count.hbs +++ b/app/components/gh-members-segment-count.hbs @@ -1,7 +1,9 @@ +{{#if this.session.user.isOwnerOrAdmin}} {{format-number this.segmentTotal}} / {{format-number this.total}} members - \ No newline at end of file + +{{/if}} \ No newline at end of file diff --git a/app/components/gh-members-segment-count.js b/app/components/gh-members-segment-count.js index 3dbf1d9c1b..41e54da6cb 100644 --- a/app/components/gh-members-segment-count.js +++ b/app/components/gh-members-segment-count.js @@ -5,6 +5,7 @@ import {tracked} from '@glimmer/tracking'; export default class GhMembersSegmentCountComponent extends Component { @service store; + @service session; @tracked total = 0; @tracked segmentTotal = 0; From a67429f32997cbf2fa557a44ec96b7cb31e6988a Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 7 May 2021 16:14:07 +0530 Subject: [PATCH 0218/3032] Reverted "Added home redirect for pricing wizard" This reverts commit d9f667737d1bb357748ea5cebc01a2553f48e47f. Hiding the launch wizard when there are existing prices causes an annoying flicker on the dashboard everytime we reload the page or navigate away. Instead of handling this client side, we'll push up the logic to hide the wizard on server. --- app/components/gh-launch-wizard/set-pricing.js | 1 + app/controllers/dashboard.js | 18 ------------------ app/routes/launch.js | 7 ------- app/templates/dashboard.hbs | 2 +- 4 files changed, 2 insertions(+), 26 deletions(-) diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index fb04c851e0..88af4d30ca 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -183,6 +183,7 @@ export default class GhLaunchWizardSetPricingComponent extends Component { ...data, product: null }); + this.args.nextStep(); } } diff --git a/app/controllers/dashboard.js b/app/controllers/dashboard.js index 06a500a5a2..63f734041e 100644 --- a/app/controllers/dashboard.js +++ b/app/controllers/dashboard.js @@ -2,7 +2,6 @@ import Controller from '@ember/controller'; import {action} from '@ember/object'; import {getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; -import {task} from 'ember-concurrency-decorators'; import {tracked} from '@glimmer/tracking'; export default class DashboardController extends Controller { @@ -36,7 +35,6 @@ export default class DashboardController extends Controller { @tracked whatsNewEntries = null; @tracked whatsNewEntriesLoading = null; @tracked whatsNewEntriesError = null; - @tracked product = null; get topMembersDataHasOpenRates() { return this.topMembersData && this.topMembersData.find((member) => { @@ -49,28 +47,12 @@ export default class DashboardController extends Controller { } initialise() { - this.loadProducts.perform(); this.loadEvents(); this.loadTopMembers(); this.loadCharts(); this.loadWhatsNew(); } - get showLaunchWizard() { - const hasPrices = this.product && this.product.get('stripePrices').length > 0; - return !this.feature.launchComplete && !hasPrices; - } - - @task({drop: true}) - *loadProducts() { - try { - const products = yield this.store.query('product', {include: 'stripe_prices'}); - this.product = products.firstObject; - } catch (e) { - this.product = null; - } - } - loadMRRStats() { this.mrrStatsLoading = true; this.membersStats.fetchMRR().then((stats) => { diff --git a/app/routes/launch.js b/app/routes/launch.js index 1e8013380e..d2802cc24b 100644 --- a/app/routes/launch.js +++ b/app/routes/launch.js @@ -6,17 +6,10 @@ export default class LaunchRoute extends AuthenticatedRoute { beforeModel() { super.beforeModel(...arguments); - return this.session.user.then((user) => { if (!user.isOwner) { return this.transitionTo('home'); } - this.store.query('product', {include: 'stripe_prices'}).then((products) => { - const defaultProduct = products.firstObject; - if (defaultProduct.get('stripePrices').length > 0) { - return this.transitionTo('home'); - } - }); }); } } diff --git a/app/templates/dashboard.hbs b/app/templates/dashboard.hbs index acb57fefd4..3e0025c489 100644 --- a/app/templates/dashboard.hbs +++ b/app/templates/dashboard.hbs @@ -7,7 +7,7 @@
    - {{#if (and this.session.user.isOwner this.showLaunchWizard)}} + {{#if (and this.session.user.isOwner (not this.feature.launchComplete))}}

    Select your publication style

    From 4cb97b65b2872f3abf681ec3cfb59460dbeee277 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 7 May 2021 11:58:05 +0100 Subject: [PATCH 0219/3032] =?UTF-8?q?=E2=9C=A8=20Added=20label=20and=20pro?= =?UTF-8?q?duct=20options=20for=20email=20recipients=20(#1947)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Team/issues/581 requires https://github.com/TryGhost/Ghost/pull/12932 - added segment option and select to default newsletter recipients setting - updated segment selector to fetch labels/products and show as options - updated segment selector and count component to call an action when count changes so we can use it in the email confirmation modal - removed usage and mapping of older `'none'`, `'all'`, `'free'`, and `'paid'` email recipient filter values --- app/adapters/post.js | 8 +++- app/components/gh-members-segment-count.js | 1 + app/components/gh-members-segment-select.hbs | 5 ++- app/components/gh-members-segment-select.js | 44 +++++++++++++++++++ app/components/gh-publishmenu-draft.hbs | 3 +- app/components/gh-publishmenu-draft.js | 19 -------- app/components/gh-publishmenu.hbs | 5 ++- app/components/gh-publishmenu.js | 35 +++++---------- app/components/modal-confirm-email-send.hbs | 13 +++--- .../settings/default-email-recipients.hbs | 15 +++++++ .../settings/default-email-recipients.js | 11 +++++ app/models/post.js | 4 +- app/styles/components/power-select.css | 20 +++++++++ app/templates/editor.hbs | 3 +- 14 files changed, 128 insertions(+), 58 deletions(-) diff --git a/app/adapters/post.js b/app/adapters/post.js index 003001f0e7..75f88670f0 100644 --- a/app/adapters/post.js +++ b/app/adapters/post.js @@ -7,7 +7,13 @@ export default ApplicationAdapter.extend({ let parsedUrl = new URL(url); if (snapshot && snapshot.adapterOptions && snapshot.adapterOptions.sendEmailWhenPublished) { - parsedUrl.searchParams.append('email_recipient_filter', snapshot.adapterOptions.sendEmailWhenPublished); + let emailRecipientFilter = snapshot.adapterOptions.sendEmailWhenPublished; + + if (emailRecipientFilter === 'status:free,status:-free') { + emailRecipientFilter = 'all'; + } + + parsedUrl.searchParams.append('email_recipient_filter', emailRecipientFilter); } return parsedUrl.toString(); diff --git a/app/components/gh-members-segment-count.js b/app/components/gh-members-segment-count.js index 41e54da6cb..04896d977c 100644 --- a/app/components/gh-members-segment-count.js +++ b/app/components/gh-members-segment-count.js @@ -28,5 +28,6 @@ export default class GhMembersSegmentCountComponent extends Component { const members = yield this.store.query('member', {limit: 1, filter: this.args.segment}); this.segmentTotal = members.meta.pagination.total; + this.args.onSegmentCountChange?.(this.segmentTotal); } } diff --git a/app/components/gh-members-segment-select.hbs b/app/components/gh-members-segment-select.hbs index 6561f8f15e..13cd7cfee4 100644 --- a/app/components/gh-members-segment-select.hbs +++ b/app/components/gh-members-segment-select.hbs @@ -12,4 +12,7 @@ {{option.name}} - \ No newline at end of file + \ No newline at end of file diff --git a/app/components/gh-members-segment-select.js b/app/components/gh-members-segment-select.js index 2e73944050..33aa777b18 100644 --- a/app/components/gh-members-segment-select.js +++ b/app/components/gh-members-segment-select.js @@ -57,6 +57,50 @@ export default class GhMembersSegmentSelect extends Component { class: 'segment-status' }]; + // fetch all labels w̶i̶t̶h̶ c̶o̶u̶n̶t̶s̶ + // TODO: add `include: 'count.members` to query once API is fixed + const labels = yield this.store.query('label', {limit: 'all'}); + + if (labels.length > 0) { + const labelsGroup = { + groupName: 'Labels', + options: [] + }; + + labels.forEach((label) => { + labelsGroup.options.push({ + name: label.name, + segment: `label:${label.slug}`, + count: label.count?.members, + class: 'segment-label' + }); + }); + + options.push(labelsGroup); + } + + // fetch all products w̶i̶t̶h̶ c̶o̶u̶n̶t̶s̶ + // TODO: add `include: 'count.members` to query once API supports + const products = yield this.store.query('product', {limit: 'all'}); + + if (products.length > 0) { + const productsGroup = { + groupName: 'Products', + options: [] + }; + + products.forEach((product) => { + productsGroup.options.push({ + name: product.name, + segment: `product:${product.slug}`, + count: product.count?.members, + class: 'segment-product' + }); + }); + + options.push(productsGroup); + } + this.options = options; } } diff --git a/app/components/gh-publishmenu-draft.hbs b/app/components/gh-publishmenu-draft.hbs index 4d62822a0b..d3b458ae3f 100644 --- a/app/components/gh-publishmenu-draft.hbs +++ b/app/components/gh-publishmenu-draft.hbs @@ -41,7 +41,8 @@
    diff --git a/app/components/gh-publishmenu-draft.js b/app/components/gh-publishmenu-draft.js index b07d410cf1..08d996cc1f 100644 --- a/app/components/gh-publishmenu-draft.js +++ b/app/components/gh-publishmenu-draft.js @@ -4,20 +4,6 @@ import {computed} from '@ember/object'; import {isEmpty} from '@ember/utils'; import {inject as service} from '@ember/service'; -const MEMBERS_SEGMENT_MAP = [{ - name: 'all', - segment: 'status:free,status:-free' -}, { - name: 'free', - segment: 'status:free' -}, { - name: 'paid', - segment: 'status:-free' -}, { - name: 'none', - segment: null -}]; - export default Component.extend({ feature: service(), settings: service(), @@ -86,11 +72,6 @@ export default Component.extend({ post.set('publishedAtBlogTime', time); return post.validate(); - }, - - setSendEmailWhenPublished(segment) { - const segmentName = MEMBERS_SEGMENT_MAP.findBy('segment', segment).name; - this.setSendEmailWhenPublished(segmentName); } }, diff --git a/app/components/gh-publishmenu.hbs b/app/components/gh-publishmenu.hbs index 4ed8cf8fc9..e14b4954e3 100644 --- a/app/components/gh-publishmenu.hbs +++ b/app/components/gh-publishmenu.hbs @@ -16,7 +16,7 @@ @saveType={{this.saveType}} @isClosing={{this.isClosing}} @canSendEmail={{this.canSendEmail}} - @recipientsSegment={{this.recipientsSegment}} + @recipientsSegment={{this.sendEmailWhenPublished}} @setSaveType={{action "setSaveType"}} @setTypedDateError={{action (mut this.typedDateError)}} @isSendingEmailLimited={{this.isSendingEmailLimited}} @@ -29,7 +29,8 @@ @setSaveType={{action "setSaveType"}} @setTypedDateError={{action (mut this.typedDateError)}} @canSendEmail={{this.canSendEmail}} - @recipientsSegment={{this.recipientsSegment}} + @recipientsSegment={{this.sendEmailWhenPublished}} + @updateMemberCount={{action "updateMemberCount"}} @setSendEmailWhenPublished={{action "setSendEmailWhenPublished"}} @isSendingEmailLimited={{this.isSendingEmailLimited}} @sendingEmailLimitError={{this.sendingEmailLimitError}} /> diff --git a/app/components/gh-publishmenu.js b/app/components/gh-publishmenu.js index ad0d6bfd08..e892eb93e7 100644 --- a/app/components/gh-publishmenu.js +++ b/app/components/gh-publishmenu.js @@ -9,20 +9,6 @@ import {task, timeout} from 'ember-concurrency'; const CONFIRM_EMAIL_POLL_LENGTH = 1000; const CONFIRM_EMAIL_MAX_POLL_LENGTH = 15 * 1000; -const MEMBERS_SEGMENT_MAP = [{ - name: 'all', - segment: 'status:free,status:-free' -}, { - name: 'free', - segment: 'status:free' -}, { - name: 'paid', - segment: 'status:-free' -}, { - name: 'none', - segment: null -}]; - export default Component.extend({ clock: service(), feature: service(), @@ -38,7 +24,7 @@ export default Component.extend({ postStatus: 'draft', runningText: null, saveTask: null, - sendEmailWhenPublished: 'none', + sendEmailWhenPublished: null, typedDateError: null, isSendingEmailLimited: false, sendingEmailLimitError: '', @@ -67,11 +53,6 @@ export default Component.extend({ !hasSentEmail; }), - recipientsSegment: computed('sendEmailWhenPublished', function () { - const segmentName = this.sendEmailWhenPublished; - return MEMBERS_SEGMENT_MAP.findBy('name', segmentName).segment; - }), - postState: computed('post.{isPublished,isScheduled}', 'forcePublishedMenu', function () { if (this.forcePublishedMenu || this.get('post.isPublished')) { return 'published'; @@ -157,21 +138,21 @@ export default Component.extend({ defaultEmailRecipients: computed('settings.{editorDefaultEmailRecipients,editorDefaultEmailRecipientsFilter}', 'post.visibility', function () { const defaultEmailRecipients = this.settings.get('editorDefaultEmailRecipients'); - if (defaultEmailRecipients === 'disabled' || defaultEmailRecipients === 'none') { - return 'none'; + if (defaultEmailRecipients === 'disabled') { + return null; } if (defaultEmailRecipients === 'visibility') { if (this.post.visibility === 'public' || this.post.visibility === 'members') { - return 'all'; + return 'status:free,status:-free'; } if (this.post.visibility === 'paid') { - return 'paid'; + return 'status:-free'; } } - return MEMBERS_SEGMENT_MAP.findBy('segment', this.settings.get('editorDefaultEmailRecipientsFilter')).name; + return this.settings.get('editorDefaultEmailRecipientsFilter'); }), didReceiveAttrs() { @@ -249,6 +230,10 @@ export default Component.extend({ this.set('isClosing', true); return true; + }, + + updateMemberCount(count) { + this.memberCount = count; } }, diff --git a/app/components/modal-confirm-email-send.hbs b/app/components/modal-confirm-email-send.hbs index ddf0cbc914..7d598e0c50 100644 --- a/app/components/modal-confirm-email-send.hbs +++ b/app/components/modal-confirm-email-send.hbs @@ -13,15 +13,18 @@

    Your post will be delivered to - {{#if (eq this.model.sendEmailWhenPublished 'paid')}} + {{#if (eq this.model.sendEmailWhenPublished 'status:-free')}} {{!-- TODO: remove editor fallback once editors can query member counts --}} - {{if this.session.user.isEditor "all paid members" (gh-pluralize this.paidMemberCount "paid member")}} - {{else if (eq this.model.sendEmailWhenPublished 'free')}} + {{if this.session.user.isEditor "all paid members" (gh-pluralize this.model.memberCount "paid member")}} + {{else if (eq this.model.sendEmailWhenPublished 'status:free')}} {{!-- TODO: remove editor fallback once editors can query member counts --}} - {{if this.session.user.isEditor "all free members" (gh-pluralize this.freeMemberCount "free member")}} - {{else}} + {{if this.session.user.isEditor "all free members" (gh-pluralize this.model.memberCount "free member")}} + {{else if (eq this.model.sendEmailWhenPublished 'status:free,status:-free')}} {{!-- TODO: remove editor fallback once editors can query member counts --}} {{if this.session.user.isEditor "all members" (gh-pluralize this.model.memberCount "member")}} + {{else}} + {{!-- TODO: remove editor fallback once editors can query member counts --}} + {{if this.session.user.isEditor "a custom members segment" (gh-pluralize this.model.memberCount "member")}} {{/if}} and will be published on your site{{#if this.model.isScheduled}} at the scheduled time{{/if}}. Sound good? diff --git a/app/components/settings/default-email-recipients.hbs b/app/components/settings/default-email-recipients.hbs index b98efeb60f..a58194ffd9 100644 --- a/app/components/settings/default-email-recipients.hbs +++ b/app/components/settings/default-email-recipients.hbs @@ -64,6 +64,21 @@

    Paid members
    +
    +
    +
    +
    Specific segment:
    +
    + +
    +
    +
    {{/liquid-if}} diff --git a/app/components/settings/default-email-recipients.js b/app/components/settings/default-email-recipients.js index c2c15d13e2..0ba055b749 100644 --- a/app/components/settings/default-email-recipients.js +++ b/app/components/settings/default-email-recipients.js @@ -62,6 +62,8 @@ export default class SettingsDefaultEmailRecipientsComponent extends Component { @action setDefaultEmailRecipients(value) { + this.segmentSelected = false; + if (['disabled', 'visibility'].includes(value)) { this.settings.set('editorDefaultEmailRecipients', value); return; @@ -83,6 +85,15 @@ export default class SettingsDefaultEmailRecipientsComponent extends Component { this.settings.set('editorDefaultEmailRecipientsFilter', 'status:-free'); } + if (value === 'segment') { + this.segmentSelected = true; + } + this.settings.set('editorDefaultEmailRecipients', 'filter'); } + + @action + setDefaultEmailRecipientsFilter(filter) { + this.settings.set('editorDefaultEmailRecipientsFilter', filter); + } } diff --git a/app/models/post.js b/app/models/post.js index b0abbfdf40..07e922a660 100644 --- a/app/models/post.js +++ b/app/models/post.js @@ -105,7 +105,7 @@ export default Model.extend(Comparable, ValidationEngine, { updatedBy: attr('number'), url: attr('string'), uuid: attr('string'), - emailRecipientFilter: attr('string', {defaultValue: 'none'}), + emailRecipientFilter: attr('members-segment-string', {defaultValue: null}), authors: hasMany('user', {embedded: 'always', async: false}), createdBy: belongsTo('user', {async: true}), @@ -152,7 +152,7 @@ export default Model.extend(Comparable, ValidationEngine, { isPage: equal('displayName', 'page'), willEmail: computed('emailRecipientFilter', function () { - return this.emailRecipientFilter !== 'none'; + return this.emailRecipientFilter !== null; }), previewUrl: computed('uuid', 'ghostPaths.url', 'config.blogUrl', function () { diff --git a/app/styles/components/power-select.css b/app/styles/components/power-select.css index 0c9699b8bc..0472e27222 100644 --- a/app/styles/components/power-select.css +++ b/app/styles/components/power-select.css @@ -268,6 +268,26 @@ fill: var(--blue); } +.token-segment-label { + background: color-mod(var(--green) alpha(0.1)); + color: var(--green); +} + +.token-segment-label svg path { + stroke: var(--green); + fill: var(--green); +} + +.token-segment-product { + background: color-mod(var(--purple) alpha(0.1)); + color: var(--purple); +} + +.token-segment-product svg path { + stroke: var(--purple); + fill: var(--purple); +} + /* Inside settings / Mailgun region */ /* TODO: make these general styles? */ diff --git a/app/templates/editor.hbs b/app/templates/editor.hbs index 4df971397c..ac67a0b9e8 100644 --- a/app/templates/editor.hbs +++ b/app/templates/editor.hbs @@ -49,8 +49,7 @@ @postStatus={{this.post.status}} @saveTask={{this.save}} @setSaveType={{action "setSaveType"}} - @onOpen={{action "cancelAutosave"}} - @memberCount={{this.memberCount}} /> + @onOpen={{action "cancelAutosave"}} /> {{/if}} {{/unless}} From 8cfe0f797c6fa50fea379f6f87d46f15954949b5 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 7 May 2021 12:04:01 +0100 Subject: [PATCH 0220/3032] Fixed email segment selector counts not taking subscription status into account refs https://github.com/TryGhost/Team/issues/496 refs https://github.com/TryGhost/Team/issues/581 - added ability to pass an enforced filter to the segment count component - used the enforced filter to add `subscribed:true` to segment counts where we're counting the number of members that would receive an email --- app/components/gh-members-segment-count.js | 14 ++++++++++++-- app/components/gh-members-segment-select.hbs | 1 + app/components/gh-publishmenu-draft.hbs | 1 + app/components/gh-publishmenu-scheduled.hbs | 1 + .../settings/default-email-recipients.hbs | 1 + 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/components/gh-members-segment-count.js b/app/components/gh-members-segment-count.js index 04896d977c..11fc3396ae 100644 --- a/app/components/gh-members-segment-count.js +++ b/app/components/gh-members-segment-count.js @@ -16,7 +16,9 @@ export default class GhMembersSegmentCountComponent extends Component { *fetchTotalsTask() { this.fetchSegmentTotalTask.perform(); - const members = yield this.store.query('member', {limit: 1}); + const filter = this.args.enforcedFilter || undefined; + + const members = yield this.store.query('member', {limit: 1, filter}); this.total = members.meta.pagination.total; } @@ -26,7 +28,15 @@ export default class GhMembersSegmentCountComponent extends Component { return this.segmentTotal = 0; } - const members = yield this.store.query('member', {limit: 1, filter: this.args.segment}); + let filter; + + if (this.args.enforcedFilter) { + filter = `${this.args.enforcedFilter}+(${this.args.segment})`; + } else { + filter = this.args.segment; + } + + const members = yield this.store.query('member', {limit: 1, filter}); this.segmentTotal = members.meta.pagination.total; this.args.onSegmentCountChange?.(this.segmentTotal); } diff --git a/app/components/gh-members-segment-select.hbs b/app/components/gh-members-segment-select.hbs index 13cd7cfee4..7fe953bad7 100644 --- a/app/components/gh-members-segment-select.hbs +++ b/app/components/gh-members-segment-select.hbs @@ -14,5 +14,6 @@ \ No newline at end of file diff --git a/app/components/gh-publishmenu-draft.hbs b/app/components/gh-publishmenu-draft.hbs index d3b458ae3f..1818cd2df7 100644 --- a/app/components/gh-publishmenu-draft.hbs +++ b/app/components/gh-publishmenu-draft.hbs @@ -44,6 +44,7 @@ @onChange={{this.setSendEmailWhenPublished}} @onSegmentCountChange={{this.updateMemberCount}} @renderInPlace={{true}} + @enforcedCountFilter="subscribed:true" /> diff --git a/app/components/gh-publishmenu-scheduled.hbs b/app/components/gh-publishmenu-scheduled.hbs index 13a78b610b..f9463fa108 100644 --- a/app/components/gh-publishmenu-scheduled.hbs +++ b/app/components/gh-publishmenu-scheduled.hbs @@ -42,6 +42,7 @@ @segment={{this.recipientsSegment}} @disabled={{true}} @renderInPlace={{true}} + @enforcedCountFilter="subscribed:true" /> diff --git a/app/components/settings/default-email-recipients.hbs b/app/components/settings/default-email-recipients.hbs index a58194ffd9..edd8af69f7 100644 --- a/app/components/settings/default-email-recipients.hbs +++ b/app/components/settings/default-email-recipients.hbs @@ -75,6 +75,7 @@ From 05747ab17d3b633a6761a97f6e2241f5644bd566 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 7 May 2021 14:13:49 +0200 Subject: [PATCH 0221/3032] Updated portal copy --- app/components/modal-portal-settings.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index a957e93157..a107a0a0af 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -32,7 +32,7 @@ {{#if this.isStripeConfigured}}
    -

    Plans available at signup

    +

    Prices available at signup

    From 953d03ba148f6a799c2d57737b2bb0842e19afba Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Fri, 7 May 2021 15:59:26 +0200 Subject: [PATCH 0224/3032] Updated publishmenu styles Refs https://github.com/TryGhost/Team/issues/581 --- app/components/gh-members-segment-count.hbs | 2 +- app/components/gh-members-segment-select.hbs | 1 + app/components/gh-members-segment-select.js | 4 +- app/components/gh-publishmenu-draft.hbs | 2 +- app/styles/app-dark.css | 22 ++++++++ app/styles/components/power-select.css | 58 ++++++++++---------- app/styles/components/publishmenu.css | 14 ++++- 7 files changed, 68 insertions(+), 35 deletions(-) diff --git a/app/components/gh-members-segment-count.hbs b/app/components/gh-members-segment-count.hbs index 3a9aad3acd..0f39086866 100644 --- a/app/components/gh-members-segment-count.hbs +++ b/app/components/gh-members-segment-count.hbs @@ -4,6 +4,6 @@ {{did-insert (perform this.fetchTotalsTask)}} {{did-update (perform this.fetchSegmentTotalTask) @segment}} > - {{format-number this.segmentTotal}} / {{format-number this.total}} members + {{format-number this.segmentTotal}} members {{/if}} \ No newline at end of file diff --git a/app/components/gh-members-segment-select.hbs b/app/components/gh-members-segment-select.hbs index 7fe953bad7..ed40842117 100644 --- a/app/components/gh-members-segment-select.hbs +++ b/app/components/gh-members-segment-select.hbs @@ -7,6 +7,7 @@ @renderInPlace={{this.renderInPlace}} @onChange={{this.setSegment}} @disabled={{@disabled}} + @class="select-members" as |option| > {{option.name}} diff --git a/app/components/gh-members-segment-select.js b/app/components/gh-members-segment-select.js index 33aa777b18..93106f8c47 100644 --- a/app/components/gh-members-segment-select.js +++ b/app/components/gh-members-segment-select.js @@ -50,11 +50,11 @@ export default class GhMembersSegmentSelect extends Component { const options = yield [{ name: 'Free members', segment: 'status:free', - class: 'segment-status' + class: 'segment-status-free' }, { name: 'Paid members', segment: 'status:-free', // paid & comped - class: 'segment-status' + class: 'segment-status-paid' }]; // fetch all labels w̶i̶t̶h̶ c̶o̶u̶n̶t̶s̶ diff --git a/app/components/gh-publishmenu-draft.hbs b/app/components/gh-publishmenu-draft.hbs index 1818cd2df7..4923e0b799 100644 --- a/app/components/gh-publishmenu-draft.hbs +++ b/app/components/gh-publishmenu-draft.hbs @@ -36,7 +36,7 @@

    {{html-safe this.sendingEmailLimitError}}

    {{else}}
    - +
    Date: Fri, 7 May 2021 16:12:47 +0200 Subject: [PATCH 0225/3032] Removed 'Add price' button when not connected to Stripe --- app/styles/layouts/products.css | 4 +--- app/templates/settings/product.hbs | 16 ++++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index 142c46f75b..027a9c9758 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -222,9 +222,7 @@ } .gh-price-list-noprices { - display: flex; - flex-direction: column; - align-items: center; + text-align: center; padding: 48px 0; color: var(--midgrey); } diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index c507c95799..2d089b9e1e 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -74,12 +74,16 @@
    -
    There are no prices for this product.
    - {{#unless this.product.isNew}} - - {{/unless}} +
    There are no prices for this product
    + {{#if this.settings.stripeConnectAccountId}} + {{#unless this.product.isNew}} + + {{/unless}} + {{else}} + You need to connect to Stripe to add prices + {{/if}}
    From 97ffac96080856c7145e4f1590c77545453073c3 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 7 May 2021 17:10:23 +0200 Subject: [PATCH 0226/3032] Removed prices from payment settings --- .../gh-members-payments-setting.hbs | 35 ++----------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/app/components/gh-members-payments-setting.hbs b/app/components/gh-members-payments-setting.hbs index b2a57ecc6e..bb096cbdd2 100644 --- a/app/components/gh-members-payments-setting.hbs +++ b/app/components/gh-members-payments-setting.hbs @@ -152,7 +152,7 @@

    Subscription pricing

    -

    Set monthly and yearly recurring subscription prices

    +

    Set default subscription currency

    @@ -161,7 +161,7 @@
    - + {{one-way-select this.selectedCurrency id="currency" @@ -176,37 +176,6 @@
    -
    -
    - - - -
    - - {{this.stripePlans.monthly.currency}}/month -
    -
    -
    -
    - - -
    - - {{this.stripePlans.yearly.currency}}/year -
    -
    -
    -
    From 71501a640f6da492331f5f7c87c880fb5b0616d4 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 7 May 2021 17:45:59 +0200 Subject: [PATCH 0227/3032] Refined archive/unarchive prices --- app/styles/layouts/products.css | 12 ++++++++---- app/templates/settings/product.hbs | 9 ++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index 027a9c9758..b9f7c2c882 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -209,12 +209,12 @@ } .gh-price-list-name span.archived { - background: var(--midgrey); - color: #fff; + background: var(--lightgrey-l2); + color: var(--midgrey); font-size: 1.2rem; } -.gh-price-list-archived .gh-price-list-name, +.gh-price-list-archived .gh-price-list-name .name, .gh-price-list-archived .gh-price-list-description, .gh-price-list-archived .gh-price-list-price span, .gh-price-list-archived .gh-price-list-subscriptions span { @@ -233,6 +233,10 @@ left: auto; } +.gh-btn-archive-toggle { + width: 80px; +} + .product-actions-menu.fade-out { animation-duration: 0.01s; pointer-events: none; @@ -247,4 +251,4 @@ display: grid; grid-template-columns: 1fr 2fr; grid-gap: 20px; -} +} \ No newline at end of file diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index 2d089b9e1e..218b2832e6 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -92,7 +92,10 @@
  • - {{price.nickname}} + {{price.nickname}} + {{#unless price.active}} + Archived + {{/unless}}

    {{price.description}} @@ -109,11 +112,11 @@ Edit {{#if price.active}} - {{else}} - {{/if}} From bf1c7cd8f7f239a629a8e1943d59a17b6b27c334 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 7 May 2021 18:36:39 +0200 Subject: [PATCH 0228/3032] Removed welcome page settings from Portal settings UI --- app/components/modal-portal-settings.hbs | 50 ------------------------ 1 file changed, 50 deletions(-) diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index a107a0a0af..104d0354ab 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -197,56 +197,6 @@ {{/if}} {{/if}}

    -
    -

    Welcome page

    - -

    For free signups

    -
    - -
    - -

    Redirect to this URL after free signup

    -
    - {{#if (and this.isStripeConfigured hasPaidPriceChecked)}} - -

    For paid signups

    - -
    - -
    - -

    Redirect to this URL after paid signup

    -
    - {{/if}} -
  • From c18f389c9aeffa8c28afeb62b3bb161182bdfc78 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 7 May 2021 22:07:42 +0530 Subject: [PATCH 0229/3032] Updated Portal links to show dynamic prices refs https://github.com/TryGhost/Team/issues/643 Currently, the whole setup for choosing plans is built around hardcoded `monthly` / `yearly` which is also exposed in the Portal links/data attributes. Since we now have custom prices, this updates the UI to show links/attributes for all available custom prices and allowing them to function via their price ids. --- app/components/gh-portal-links.hbs | 93 ++++++++++++------------------ app/components/gh-portal-links.js | 73 +++++++++++++---------- 2 files changed, 80 insertions(+), 86 deletions(-) diff --git a/app/components/gh-portal-links.hbs b/app/components/gh-portal-links.hbs index e8dd74c68f..4f32bfd9af 100644 --- a/app/components/gh-portal-links.hbs +++ b/app/components/gh-portal-links.hbs @@ -26,8 +26,8 @@ data-portal {{/if}} - + + + + {{/each}} Sign up/Free @@ -92,50 +115,8 @@ data-portal="signup/free" {{/if}} - - - - - - Sign up/Monthly - -
    -
    - {{#if isLink}} - {{this.siteUrl}}/#/portal/signup/monthly - {{else}} - data-portal="signup/monthly" - {{/if}} -
    - -
    - - - - Sign up/Yearly - -
    -
    - {{#if isLink}} - {{this.siteUrl}}/#/portal/signup/yearly - {{else}} - data-portal="signup/yearly" - {{/if}} -
    -
    - \ No newline at end of file diff --git a/app/components/modal-free-membership-settings.js b/app/components/modal-free-membership-settings.js index 3836215b32..66a0f2fd6e 100644 --- a/app/components/modal-free-membership-settings.js +++ b/app/components/modal-free-membership-settings.js @@ -1,12 +1,21 @@ import ModalBase from 'ghost-admin/components/modal-base'; import classic from 'ember-classic-decorator'; import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; // TODO: update modals to work fully with Glimmer components @classic export default class ModalFreeMembershipSettings extends ModalBase { + @service settings; + @service config; + + @tracked freeSignupRedirect; + @tracked siteUrl; init() { super.init(...arguments); + this.siteUrl = this.config.get('blogUrl'); } @action @@ -19,6 +28,58 @@ export default class ModalFreeMembershipSettings extends ModalBase { // needed because ModalBase uses .send() for keyboard events closeModal() { this.close(); + }, + updateName(value) { + this.settings.set('membersFreePriceName', value); + }, + updateDescription(value) { + this.settings.set('membersFreePriceDescription', value); + }, + setFreeSignupRedirect(url) { + this.freeSignupRedirect = url; + }, + validateFreeSignupRedirect() { + return this._validateSignupRedirect(this.freeSignupRedirect, 'membersFreeSignupRedirect'); + } + } + + @task({drop: true}) + *save() { + try { + this.send('validateFreeSignupRedirect'); + if (this.settings.get('errors').length !== 0) { + return; + } + yield this.settings.save(); + this.send('closeModal'); + } catch (error) { + this.notifications.showAPIError(error, {key: 'settings.save'}); + } finally { + this.send('closeModal'); + } + } + + _validateSignupRedirect(url, type) { + let errMessage = `Please enter a valid URL`; + this.settings.get('errors').remove(type); + this.settings.get('hasValidated').removeObject(type); + + if (url === null) { + this.settings.get('errors').add(type, errMessage); + this.settings.get('hasValidated').pushObject(type); + return false; + } + + if (url === undefined) { + // Not initialised + return; + } + + if (url.href.startsWith(this.siteUrl)) { + const path = url.href.replace(this.siteUrl, ''); + this.settings.set(type, path); + } else { + this.settings.set(type, url.href); } } } diff --git a/app/controllers/settings/products.js b/app/controllers/settings/products.js index 2fe54887cc..ad746c2028 100644 --- a/app/controllers/settings/products.js +++ b/app/controllers/settings/products.js @@ -5,6 +5,7 @@ import {inject as service} from '@ember/service'; import {tracked} from '@glimmer/tracking'; export default class ProductsController extends Controller { + @service settings; @service config; @tracked iconStyle = ''; diff --git a/app/models/setting.js b/app/models/setting.js index b84f0367d1..70763de394 100644 --- a/app/models/setting.js +++ b/app/models/setting.js @@ -59,6 +59,8 @@ export default Model.extend(ValidationEngine, { membersReplyAddress: attr('string'), membersPaidSignupRedirect: attr('string'), membersFreeSignupRedirect: attr('string'), + membersFreePriceName: attr('string'), + membersFreePriceDescription: attr('string'), stripeProductName: attr('string'), stripeSecretKey: attr('string'), stripePublishableKey: attr('string'), diff --git a/app/templates/settings/products.hbs b/app/templates/settings/products.hbs index befe459ac5..0359a9a04d 100644 --- a/app/templates/settings/products.hbs +++ b/app/templates/settings/products.hbs @@ -15,7 +15,7 @@ Free membership

    - Product description + {{this.settings.membersFreePriceDescription}}

    Customize From 82fe2c33d872a4dba869e4beb61b4aa9f8a6a708 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 7 May 2021 22:59:59 +0530 Subject: [PATCH 0232/3032] Fixed signup link for Portal prices refs https://github.com/TryGhost/Team/issues/643 refs https://github.com/TryGhost/Admin/commit/c18f389c9aeffa8c28afeb62b3bb161182bdfc78 Last commit had incorrectly formatted the signup links for custom prices, fixed. --- app/components/gh-portal-links.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/gh-portal-links.js b/app/components/gh-portal-links.js index 211c2f1582..98ef69f194 100644 --- a/app/components/gh-portal-links.js +++ b/app/components/gh-portal-links.js @@ -60,9 +60,9 @@ export default Component.extend({ this.set('copiedPrice', price.id); let data = ''; if (this.isLink) { - data = `#/portal/${price.id}`; + data = `#/portal/signup/${price.id}`; } else { - data = `data-portal="${price.id}"`; + data = `data-portal="signup/${price.id}"`; } copyTextToClipboard(data); yield timeout(this.isTesting ? 50 : 3000); From c238b38d8e4f692647a54d9f9ef6c2d0d94d34ca Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 7 May 2021 17:53:14 +0000 Subject: [PATCH 0233/3032] Update dependency eslint-plugin-ghost to v2.2.0 --- package.json | 2 +- yarn.lock | 352 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 331 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 848b1270d4..02226e9c3e 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "ember-useragent": "0.10.0", "emberx-file-input": "1.2.1", "eslint": "7.25.0", - "eslint-plugin-ghost": "2.1.0", + "eslint-plugin-ghost": "2.2.0", "faker": "5.5.3", "fs-extra": "10.0.0", "glob": "7.1.6", diff --git a/yarn.lock b/yarn.lock index dfaba9a539..a9d04c0998 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,6 +52,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.12.16": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" + integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + "@babel/core@^7.13.10": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" @@ -73,6 +94,15 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/eslint-parser@^7.12.16": + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.13.14.tgz#f80fd23bdd839537221914cb5d17720a5ea6ba3a" + integrity sha512-I0HweR36D73Ibn/FfrRDMKlMqJHFwidIUgYdMpH+aXYuQC+waq59YaJ6t9e9N36axJ82v1jR041wwqDrDXEwRA== + dependencies: + eslint-scope "^5.1.0" + eslint-visitor-keys "^1.3.0" + semver "^6.3.0" + "@babel/generator@^7.12.10", "@babel/generator@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" @@ -100,6 +130,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz#1f99331babd65700183628da186f36f63d615c93" + integrity sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ== + dependencies: + "@babel/types" "^7.14.1" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.4": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" @@ -315,6 +354,20 @@ "@babel/traverse" "^7.13.13" "@babel/types" "^7.13.14" +"@babel/helper-module-transforms@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" + integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.14.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + "@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" @@ -408,6 +461,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + "@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" @@ -446,6 +504,15 @@ "@babel/traverse" "^7.13.17" "@babel/types" "^7.13.17" +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + "@babel/highlight@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" @@ -479,6 +546,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== +"@babel/parser@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" + integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== + "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566" @@ -1221,6 +1293,20 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" + integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.0" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.14.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.7": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" @@ -1247,6 +1333,14 @@ "@babel/helper-validator-identifier" "^7.12.11" to-fast-properties "^2.0.0" +"@babel/types@^7.14.0", "@babel/types@^7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" + integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -2113,6 +2207,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.61.tgz#29f124eddd41c4c74281bd0b455d689109fc2a2d" integrity sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/q@^1.5.1": version "1.5.4" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" @@ -4543,6 +4642,11 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +builtin-modules@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -4866,6 +4970,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a" + integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -4906,6 +5015,13 @@ clean-css@^3.4.5: commander "2.8.x" source-map "0.4.x" +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= + dependencies: + escape-string-regexp "^1.0.5" + clean-up-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" @@ -7733,22 +7849,44 @@ eslint-plugin-ember@9.3.0: lodash.kebabcase "^4.1.1" snake-case "^3.0.3" -eslint-plugin-ghost@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ghost/-/eslint-plugin-ghost-2.1.0.tgz#811402f32e6339be526368b1ce1b3b4be26a2e4d" - integrity sha512-zeAFtxthQ8GaC1LV4e+n6DMfLfl8AEAagYT63SQ1jYzYykK4Wmh0xEADMR0tZFl8eHzTornAyQWmWSwS7CUkXQ== +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-ghost@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ghost/-/eslint-plugin-ghost-2.2.0.tgz#3b0f279f89cb57e17e98f664624cb8221a1591c0" + integrity sha512-BASnZGz1qYn6TvyEpIA4Z4QnHmAXWA5WjdkMQOPeXX1wVhyI4Fobm/rqp+YhMm3XC6JE0g5aO/A76et09ulMPg== dependencies: eslint-plugin-ember "9.3.0" - eslint-plugin-mocha "8.0.0" + eslint-plugin-mocha "7.0.1" + eslint-plugin-node "11.1.0" eslint-plugin-sort-imports-es6-autofix "0.5.0" + eslint-plugin-unicorn "31.0.0" -eslint-plugin-mocha@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-8.0.0.tgz#7ec5d228bcb3735301701dfbc3376320a1ca3791" - integrity sha512-n67etbWDz6NQM+HnTwZHyBwz/bLlYPOxUbw7bPuCyFujv7ZpaT/Vn6KTAbT02gf7nRljtYIjWcTxK/n8a57rQQ== +eslint-plugin-mocha@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-7.0.1.tgz#b2e9e8ebef7836f999a83f8bab25d0e0c05f0d28" + integrity sha512-zkQRW9UigRaayGm/pK9TD5RjccKXSgQksNtpsXbG9b6L5I+jNx7m98VUbZ4w1H1ArlNA+K7IOH+z8TscN6sOYg== dependencies: - eslint-utils "^2.1.0" - ramda "^0.27.1" + eslint-utils "^2.0.0" + ramda "^0.27.0" + +eslint-plugin-node@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" eslint-plugin-sort-imports-es6-autofix@0.5.0: version "0.5.0" @@ -7757,6 +7895,26 @@ eslint-plugin-sort-imports-es6-autofix@0.5.0: dependencies: eslint "^6.2.2" +eslint-plugin-unicorn@31.0.0: + version "31.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-31.0.0.tgz#53eef3f5152ddaa531888f77a420313e30d9864a" + integrity sha512-HR3gI4ANtV8A+0FLAaxjBD/G5J3PWBo+7OswyGeK5nylGqtKLJVbnPksIkBgmVg+SFpxu5MnjaxQQI+9KjyVAg== + dependencies: + ci-info "^3.1.1" + clean-regexp "^1.0.0" + eslint-template-visitor "^2.3.2" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + import-modules "^2.1.0" + is-builtin-module "^3.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.23" + reserved-words "^0.1.2" + safe-regex "^2.1.1" + semver "^7.3.5" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -7765,7 +7923,7 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@^5.0.0, eslint-scope@^5.1.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -7773,6 +7931,17 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-template-visitor@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz#b52f96ff311e773a345d79053ccc78275bbc463d" + integrity sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA== + dependencies: + "@babel/core" "^7.12.16" + "@babel/eslint-parser" "^7.12.16" + eslint-visitor-keys "^2.0.0" + esquery "^1.3.1" + multimap "^1.1.0" + eslint-utils@^1.3.1, eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" @@ -7780,7 +7949,7 @@ eslint-utils@^1.3.1, eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^2.1.0: +eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== @@ -7974,7 +8143,7 @@ esquery@^1.0.1: dependencies: estraverse "^5.1.0" -esquery@^1.4.0: +esquery@^1.3.1, esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== @@ -9395,6 +9564,11 @@ hooker@~0.2.3: resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959" integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk= +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + hosted-git-info@^3.0.6: version "3.0.7" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" @@ -9561,6 +9735,11 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-modules@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.1.0.tgz#abe7df297cb6c1f19b57246eb8b8bd9664b6d8c2" + integrity sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -9785,6 +9964,13 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-builtin-module@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.1.0.tgz#6fdb24313b1c03b75f8b9711c0feb8c30b903b00" + integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg== + dependencies: + builtin-modules "^3.0.0" + is-callable@^1.1.4, is-callable@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" @@ -10282,6 +10468,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -10458,6 +10649,11 @@ line-column@^1.0.2: isarray "^1.0.0" isobject "^2.0.0" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + linkify-it@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" @@ -11480,6 +11676,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multimap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" + integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== + mustache@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" @@ -11645,6 +11846,16 @@ nopt@~4.0.1: abbrev "1" osenv "^0.1.4" +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -12066,6 +12277,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" @@ -12278,6 +12499,11 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -12846,7 +13072,7 @@ raf-pool@~0.1.4: resolved "https://registry.yarnpkg.com/raf-pool/-/raf-pool-0.1.4.tgz#6b9f75ea1903c16e162ffe8c76688f5a625bc2cd" integrity sha512-BBPamTVuSprPq7CUmgxc+ycbsYUtUYnQtJYEfMHXMaostPaNpQzipLfSa/rwjmlgjBPiD7G+I+8W340sLOPu6g== -ramda@^0.27.1: +ramda@^0.27.0: version "0.27.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== @@ -12896,6 +13122,25 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -13029,6 +13274,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@^0.1.23, regexp-tree@~0.1.1: + version "0.1.23" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.23.tgz#8a8ce1cc5e971acef62213a7ecdb1f6e18a1f1b2" + integrity sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw== + regexp.prototype.flags@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" @@ -13042,7 +13292,7 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.1.0: +regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== @@ -13181,6 +13431,11 @@ reselect@^4.0.0: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -13423,6 +13678,13 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -13480,17 +13742,17 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -13502,6 +13764,13 @@ semver@^7.0.0, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: dependencies: lru-cache "^6.0.0" +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -13891,6 +14160,32 @@ spawn-args@^0.2.0: resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -14678,6 +14973,11 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -14968,6 +15268,14 @@ v8flags@~3.2.0: dependencies: homedir-polyfill "^1.0.1" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" From f43ed40075a48d507f596342345b6dd5d10bee15 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Sat, 8 May 2021 12:21:22 +0100 Subject: [PATCH 0234/3032] Removed unnecessary options from default email recipients setting refs https://github.com/TryGhost/Team/issues/496 - all/free/paid are selectable via the segment select - radio buttons should be kept to 3-4 max - fixed pluralisation of member count below member segment when only 1 member is selected --- app/components/gh-members-segment-count.hbs | 2 +- .../settings/default-email-recipients.hbs | 53 +++++-------------- .../settings/default-email-recipients.js | 39 +------------- 3 files changed, 15 insertions(+), 79 deletions(-) diff --git a/app/components/gh-members-segment-count.hbs b/app/components/gh-members-segment-count.hbs index 0f39086866..57045c0f53 100644 --- a/app/components/gh-members-segment-count.hbs +++ b/app/components/gh-members-segment-count.hbs @@ -4,6 +4,6 @@ {{did-insert (perform this.fetchTotalsTask)}} {{did-update (perform this.fetchSegmentTotalTask) @segment}} > - {{format-number this.segmentTotal}} members + {{format-number this.segmentTotal}} {{gh-pluralize this.segmentTotal "member" without-count=true}} {{/if}} \ No newline at end of file diff --git a/app/components/settings/default-email-recipients.hbs b/app/components/settings/default-email-recipients.hbs index edd8af69f7..183b603e49 100644 --- a/app/components/settings/default-email-recipients.hbs +++ b/app/components/settings/default-email-recipients.hbs @@ -11,12 +11,19 @@
    -
    Disabled
    +
    Send emails to
    +
    + +
    -
    -
    -
    All members
    -
    -
    -
    -
    -
    -
    Free members
    -
    -
    -
    -
    -
    -
    Paid members
    -
    -
    -
    -
    Specific segment:
    -
    - -
    +
    Disabled
    diff --git a/app/components/settings/default-email-recipients.js b/app/components/settings/default-email-recipients.js index 0ba055b749..bb35614ca2 100644 --- a/app/components/settings/default-email-recipients.js +++ b/app/components/settings/default-email-recipients.js @@ -29,34 +29,9 @@ export default class SettingsDefaultEmailRecipientsComponent extends Component { this.settings.get('editorDefaultEmailRecipientsFilter') === null; } - get isAllSelected() { - return !this.isDisabled && - !this.segmentSelected && - this.settings.get('editorDefaultEmailRecipients') === 'filter' && - this.settings.get('editorDefaultEmailRecipientsFilter') === 'status:free,status:-free'; - } - - get isFreeSelected() { - return !this.isDisabled && - !this.segmentSelected && - this.settings.get('editorDefaultEmailRecipients') === 'filter' && - this.settings.get('editorDefaultEmailRecipientsFilter') === 'status:free'; - } - - get isPaidSelected() { - return !this.isDisabled && - !this.segmentSelected && - this.settings.get('editorDefaultEmailRecipients') === 'filter' && - this.settings.get('editorDefaultEmailRecipientsFilter') === 'status:-free'; - } - get isSegmentSelected() { const isCustomSegment = this.settings.get('editorDefaultEmailRecipients') === 'filter' && - !this.isNobodySelected && - !this.isAllSelected && - !this.isFreeSelected && - !this.isPaidSelected; - + !this.isNobodySelected; return !this.isDisabled && (this.segmentSelected || isCustomSegment); } @@ -73,18 +48,6 @@ export default class SettingsDefaultEmailRecipientsComponent extends Component { this.settings.set('editorDefaultEmailRecipientsFilter', null); } - if (value === 'all') { - this.settings.set('editorDefaultEmailRecipientsFilter', 'status:free,status:-free'); - } - - if (value === 'free') { - this.settings.set('editorDefaultEmailRecipientsFilter', 'status:free'); - } - - if (value === 'paid') { - this.settings.set('editorDefaultEmailRecipientsFilter', 'status:-free'); - } - if (value === 'segment') { this.segmentSelected = true; } From ee6ce6a50da98921110350c0ae6f7273ce580596 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Sun, 9 May 2021 17:36:45 +0530 Subject: [PATCH 0235/3032] Added default description to prices refs https://github.com/TryGhost/Team/issues/641 When default prices are created via the setup wizard, this adds a default description for Monthly and Yearly prices that mimics the values set for them currently in Portal. --- app/components/gh-launch-wizard/set-pricing.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index 88af4d30ca..47f5c98c6f 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -143,15 +143,25 @@ export default class GhLaunchWizardSetPricingComponent extends Component { this.args.nextStep(); } + calculateDiscount(monthly, yearly) { + if (isNaN(monthly) || isNaN(yearly)) { + return 0; + } + + return monthly ? 100 - Math.floor((yearly / 12 * 100) / monthly) : 0; + } + getProduct() { if (this.product) { const stripePrices = this.product.stripePrices || []; if (stripePrices.length === 0 && this.stripeMonthlyAmount && this.stripeYearlyAmount) { + const yearlyDiscount = this.calculateDiscount(this.stripeMonthlyAmount, this.stripeYearlyAmount); stripePrices.push( { nickname: 'Monthly', amount: this.stripeMonthlyAmount * 100, active: 1, + description: 'Full Access', currency: this.currency, interval: 'month', type: 'recurring' @@ -161,6 +171,7 @@ export default class GhLaunchWizardSetPricingComponent extends Component { amount: this.stripeYearlyAmount * 100, active: 1, currency: this.currency, + description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full Access', interval: 'month', type: 'recurring' } From 222f2171526d10d2a20ed621347e603d4d02562a Mon Sep 17 00:00:00 2001 From: Rishabh Date: Sun, 9 May 2021 18:14:36 +0530 Subject: [PATCH 0236/3032] Updated sorted price list in product details refs https://github.com/TryGhost/Team/issues/641 By default, the prices list for a Product will be now shown sorted based on this order -> Active -> Currency -> Amount. --- app/controllers/settings/product.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/controllers/settings/product.js b/app/controllers/settings/product.js index fcb6807529..770141590b 100644 --- a/app/controllers/settings/product.js +++ b/app/controllers/settings/product.js @@ -30,6 +30,12 @@ export default class ProductController extends Controller { ...d, amount: d.amount / 100 }; + }).sort((a, b) => { + return a.amount - b.amount; + }).sort((a, b) => { + return a.currency.localeCompare(b.currency, undefined, {ignorePunctuation: true}); + }).sort((a, b) => { + return (a.active === b.active) ? 0 : (a.active ? -1 : 1); }); } From 018d3ddc17d9a302cd13a5e370e14ec2540d8185 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Sun, 9 May 2021 23:27:16 +0530 Subject: [PATCH 0237/3032] Fixed price amount changing on save no refs On (un)archiving a price, the visible amount for a price fluctuated till the save was completed due to incorrect amount calculation, fixed here. --- app/controllers/settings/product.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/settings/product.js b/app/controllers/settings/product.js index 770141590b..f5d6621c51 100644 --- a/app/controllers/settings/product.js +++ b/app/controllers/settings/product.js @@ -89,12 +89,14 @@ export default class ProductController extends Controller { @action async archivePrice(price) { price.active = false; + price.amount = price.amount * 100; this.send('savePrice', price); } @action async activatePrice(price) { price.active = true; + price.amount = price.amount * 100; this.send('savePrice', price); } From 8527483f033865e69854d323d8c222a37babb180 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Sun, 9 May 2021 23:28:44 +0530 Subject: [PATCH 0238/3032] Disabled price actions on product save no refs Disables Edit/Archive actions on a price while an active save is ongoing for Product to avoid unwanted states due to multiple saves being called. --- app/templates/settings/product.hbs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index 218b2832e6..1c3d764714 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -77,7 +77,8 @@
    There are no prices for this product
    {{#if this.settings.stripeConnectAccountId}} {{#unless this.product.isNew}} - {{/unless}} @@ -112,11 +113,11 @@ Edit {{#if price.active}} - {{else}} - {{/if}} From 28862be1a4fdb64129902fc741b9c4611cdd7a9c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 10 May 2021 01:17:31 +0000 Subject: [PATCH 0239/3032] Update dependency eslint to v7.26.0 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 02226e9c3e..83ea8f5b94 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "ember-truth-helpers": "3.0.0", "ember-useragent": "0.10.0", "emberx-file-input": "1.2.1", - "eslint": "7.25.0", + "eslint": "7.26.0", "eslint-plugin-ghost": "2.2.0", "faker": "5.5.3", "fs-extra": "10.0.0", diff --git a/yarn.lock b/yarn.lock index a9d04c0998..1d0394fdd4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1796,10 +1796,10 @@ "@embroider/macros" "0.36.0" ember-cli-babel "^7.22.1" -"@eslint/eslintrc@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" - integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== +"@eslint/eslintrc@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" + integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -7966,13 +7966,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.25.0: - version "7.25.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" - integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== +eslint@7.26.0: + version "7.26.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.26.0.tgz#d416fdcdcb3236cd8f282065312813f8c13982f6" + integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== dependencies: "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.0" + "@eslint/eslintrc" "^0.4.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" From eab910b915f4cb189d0a81bd010d2076acfc3976 Mon Sep 17 00:00:00 2001 From: Naz Date: Mon, 10 May 2021 15:04:10 +0400 Subject: [PATCH 0240/3032] Fixed hardcoded limit error message refs https://github.com/TryGhost/Team/issues/588 - When the email limit was reached the hardcoded "members" error message was shown. Have changed implementation of the upgrade modal to take the "message" coming from the server into account --- app/components/modal-upgrade-host-limit.hbs | 2 +- app/components/modal-upgrade-host-limit.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/components/modal-upgrade-host-limit.hbs b/app/components/modal-upgrade-host-limit.hbs index 0cf88e3dc3..c67d6ea38f 100644 --- a/app/components/modal-upgrade-host-limit.hbs +++ b/app/components/modal-upgrade-host-limit.hbs @@ -6,7 +6,7 @@ diff --git a/app/components/modal-upgrade-host-limit.js b/app/components/modal-upgrade-host-limit.js index 967ed35f3d..8dee14ae98 100644 --- a/app/components/modal-upgrade-host-limit.js +++ b/app/components/modal-upgrade-host-limit.js @@ -7,7 +7,9 @@ export default ModalComponent.extend({ upgradeMessage: computed('details', function () { const {limit, total} = this.model.details; - return {limit, total}; + const message = this.model.message; + + return {limit, total, message}; }), actions: { upgrade: function () { From 6dfab40db950a0db66c128b1346c465ad2635cb8 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 10 May 2021 18:48:24 +0530 Subject: [PATCH 0241/3032] Updated price description to sentence case closes https://github.com/TryGhost/Team/issues/680 We use sentence case for labels everywhere, updating price descriptions to use the same. --- app/components/gh-launch-wizard/set-pricing.js | 4 ++-- app/models/stripe-price.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index 47f5c98c6f..0c79916d1c 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -161,7 +161,7 @@ export default class GhLaunchWizardSetPricingComponent extends Component { nickname: 'Monthly', amount: this.stripeMonthlyAmount * 100, active: 1, - description: 'Full Access', + description: 'Full access', currency: this.currency, interval: 'month', type: 'recurring' @@ -171,7 +171,7 @@ export default class GhLaunchWizardSetPricingComponent extends Component { amount: this.stripeYearlyAmount * 100, active: 1, currency: this.currency, - description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full Access', + description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access', interval: 'month', type: 'recurring' } diff --git a/app/models/stripe-price.js b/app/models/stripe-price.js index 45de6663af..31950c50cf 100644 --- a/app/models/stripe-price.js +++ b/app/models/stripe-price.js @@ -5,7 +5,7 @@ export default EmberObject.extend({ stripe_price_id: 'ID of the Stripe Price', stripe_product_id: 'ID of the Stripe Product the Stripe Price is associated with', nickname: 'price nickname e.g. "Monthly"', - description: 'price description e.g. "Full Access"', + description: 'price description e.g. "Full access"', amount: 'amount in smallest denomination e.g. cents, so value for 5 dollars would be 500', currency: 'e.g. usd', type: 'either one_time or recurring', From fcb285b83d78b7f130c152df69c865b9c3f860b5 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 10 May 2021 19:18:30 +0530 Subject: [PATCH 0242/3032] Added error handling for product details page refs https://github.com/TryGhost/Team/issues/678 Product name is a mandatory field for a custom product, this change adds error handling on save and custom error message if product is attempted to save without name. --- app/controllers/settings/product.js | 4 ++++ app/templates/settings/product.hbs | 4 ++-- app/validators/product.js | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/controllers/settings/product.js b/app/controllers/settings/product.js index f5d6621c51..2151e27257 100644 --- a/app/controllers/settings/product.js +++ b/app/controllers/settings/product.js @@ -160,6 +160,10 @@ export default class ProductController extends Controller { @task({restartable: true}) *saveTask() { this.send('validatePaidSignupRedirect'); + this.product.validate(); + if (this.product.get('errors').length !== 0) { + return; + } if (this.settings.get('errors').length !== 0) { return; } diff --git a/app/templates/settings/product.hbs b/app/templates/settings/product.hbs index 1c3d764714..42d8cabfa8 100644 --- a/app/templates/settings/product.hbs +++ b/app/templates/settings/product.hbs @@ -29,10 +29,10 @@

    Product details

    - + - + diff --git a/app/validators/product.js b/app/validators/product.js index 75a88812e0..f17400c093 100644 --- a/app/validators/product.js +++ b/app/validators/product.js @@ -5,6 +5,10 @@ export default BaseValidator.create({ properties: ['name'], name(model) { + if (!model.name) { + model.errors.add('name', 'Please enter Name.'); + this.invalidate(); + } if (!validator.isLength(model.name || '', 0, 191)) { model.errors.add('name', 'Name cannot be longer than 191 characters.'); this.invalidate(); From 090e4645db0df6a98179d68c66fba133e85cb1e8 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 10 May 2021 20:59:05 +0530 Subject: [PATCH 0243/3032] Added error handling for price modal refs https://github.com/TryGhost/Team/issues/678 Covers error handling for missing name/amount/billing period for a price modal when adding a new price or editing existing price. --- app/components/modal-product-price.hbs | 16 ++++---- app/components/modal-product-price.js | 56 +++++++++++++++++--------- app/controllers/settings/product.js | 6 ++- 3 files changed, 52 insertions(+), 26 deletions(-) diff --git a/app/components/modal-product-price.hbs b/app/components/modal-product-price.hbs index 7ff0ec1c36..91e60cccab 100644 --- a/app/components/modal-product-price.hbs +++ b/app/components/modal-product-price.hbs @@ -9,7 +9,7 @@
    - + {{/if}} diff --git a/app/components/settings/default-email-recipients.hbs b/app/components/settings/default-email-recipients.hbs index 183b603e49..51e08afe4e 100644 --- a/app/components/settings/default-email-recipients.hbs +++ b/app/components/settings/default-email-recipients.hbs @@ -11,13 +11,13 @@
    Send emails to
    -
    +
    Date: Tue, 11 May 2021 12:14:14 +0100 Subject: [PATCH 0257/3032] Fixed click on "Members-only" radio button in PSM not changing selection no issue - moved click handler so it applies to the whole button/field/select element --- app/components/gh-post-settings-menu.hbs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/gh-post-settings-menu.hbs b/app/components/gh-post-settings-menu.hbs index be0ad108eb..3fceb441f9 100644 --- a/app/components/gh-post-settings-menu.hbs +++ b/app/components/gh-post-settings-menu.hbs @@ -90,10 +90,11 @@
    -
    Members-only
    +
    Members-only
    Date: Tue, 11 May 2021 12:23:34 +0100 Subject: [PATCH 0258/3032] Removed additional options from visibility select when all members selected refs https://github.com/TryGhost/Team/issues/581 - when free and paid members are selected it doesn't make sense to offer any other options because they will have no effect - reduces confusion from showing options that get removed by the API as soon as they are selected - `status:free,status:-free,...` is always shortened to `members` (`status:free,status:-free` equivalent) --- app/components/gh-members-segment-select.js | 17 ++++++++++++++--- app/components/gh-post-settings-menu.hbs | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/components/gh-members-segment-select.js b/app/components/gh-members-segment-select.js index 93106f8c47..9c9aae9548 100644 --- a/app/components/gh-members-segment-select.js +++ b/app/components/gh-members-segment-select.js @@ -7,7 +7,7 @@ import {tracked} from '@glimmer/tracking'; export default class GhMembersSegmentSelect extends Component { @service store; - @tracked options = []; + @tracked _options = []; get renderInPlace() { return this.args.renderInPlace === undefined ? false : this.args.renderInPlace; @@ -18,6 +18,17 @@ export default class GhMembersSegmentSelect extends Component { this.fetchOptionsTask.perform(); } + get options() { + if (this.args.hideOptionsWhenAllSelected) { + const selectedSegments = this.selectedOptions.mapBy('segment'); + if (selectedSegments.includes('status:free') && selectedSegments.includes('status:-free')) { + return this._options.filter(option => !option.groupName); + } + } + + return this._options; + } + get flatOptions() { const options = []; @@ -29,7 +40,7 @@ export default class GhMembersSegmentSelect extends Component { options.push(option); } - this.options.forEach(getOptions); + this._options.forEach(getOptions); return options; } @@ -101,6 +112,6 @@ export default class GhMembersSegmentSelect extends Component { options.push(productsGroup); } - this.options = options; + this._options = options; } } diff --git a/app/components/gh-post-settings-menu.hbs b/app/components/gh-post-settings-menu.hbs index 3fceb441f9..fcdcae3f8f 100644 --- a/app/components/gh-post-settings-menu.hbs +++ b/app/components/gh-post-settings-menu.hbs @@ -100,6 +100,7 @@ @segment={{this.post.visibilitySegment}} @onChange={{action "setVisibility"}} @renderInPlace={{true}} + @hideOptionsWhenAllSelected={{true}} />
    From f00830a770991b4aa3a474a56c8f692f118ed054 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 11 May 2021 13:20:53 +0100 Subject: [PATCH 0259/3032] Fixed publish menu email recipients not matching post visibility no issue - updated to use the NQL query that now exists in `posts.visibility` rather than the older `members` and `paid` values --- app/components/gh-publishmenu.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/components/gh-publishmenu.js b/app/components/gh-publishmenu.js index e892eb93e7..92bc1ccdcb 100644 --- a/app/components/gh-publishmenu.js +++ b/app/components/gh-publishmenu.js @@ -143,13 +143,11 @@ export default Component.extend({ } if (defaultEmailRecipients === 'visibility') { - if (this.post.visibility === 'public' || this.post.visibility === 'members') { + if (this.post.visibility === 'public') { return 'status:free,status:-free'; } - if (this.post.visibility === 'paid') { - return 'status:-free'; - } + return this.post.visibility; } return this.settings.get('editorDefaultEmailRecipientsFilter'); From 05c7ba8923dea3b5b66a9ec1c4aaaefda69c954a Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 11 May 2021 17:52:43 +0530 Subject: [PATCH 0260/3032] Fixed interval for default price no refs --- app/components/gh-launch-wizard/set-pricing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index 46234831aa..2a81480852 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -185,7 +185,7 @@ export default class GhLaunchWizardSetPricingComponent extends Component { active: 1, currency: this.currency, description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access', - interval: 'month', + interval: 'year', type: 'recurring' } ); From e795ca6e145959db366488362c063d19ac382e49 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Tue, 11 May 2021 13:34:31 +0100 Subject: [PATCH 0261/3032] v4.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 166925199b..a09e2e3752 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.4.0", + "version": "4.5.0", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 74bd1765ff46a709cc4cc19e220573c26ad94b91 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 12:19:27 +0100 Subject: [PATCH 0262/3032] Update dependency ember-cli-string-helpers to v6.1.0 (#1957) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a09e2e3752..fddf006ac1 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "ember-cli-node-assets": "0.2.2", "ember-cli-postcss": "6.0.1", "ember-cli-shims": "1.2.0", - "ember-cli-string-helpers": "6.0.1", + "ember-cli-string-helpers": "6.1.0", "ember-cli-terser": "4.0.2", "ember-cli-test-loader": "3.0.0", "ember-composable-helpers": "4.4.1", diff --git a/yarn.lock b/yarn.lock index c949962e0c..667ea7aaa3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6707,10 +6707,10 @@ ember-cli-shims@1.2.0: ember-rfc176-data "^0.3.1" silent-error "^1.0.1" -ember-cli-string-helpers@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-6.0.1.tgz#6690b23b5cd60cc3ab86ce78125a2f9bd0f1cd41" - integrity sha512-91Po3HRroSI60zm9QUpnt6DXNB3rNBKFAmCptDD758gZyjfDMXtu1ZWWixB7EQXQaMy8bVq+2ZvQIPkclieJPw== +ember-cli-string-helpers@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-6.1.0.tgz#aeb96112bb91c540b869ed8b9c680f7fd5859cb6" + integrity sha512-Lw8B6MJx2n8CNF2TSIKs+hWLw0FqSYjr2/NRPyquyYA05qsl137WJSYW3ZqTsLgoinHat0DGF2qaCXocLhLmyA== dependencies: "@babel/core" "^7.13.10" broccoli-funnel "^3.0.3" From 7d91ed8f9731957c17ee382460a17bd4f7e2aa78 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 12:19:44 +0100 Subject: [PATCH 0263/3032] Update dependency @tryghost/helpers to v1.1.44 (#1958) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index fddf006ac1..a417c079fb 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "2.0.0", - "@tryghost/helpers": "1.1.43", + "@tryghost/helpers": "1.1.44", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", "@tryghost/limit-service": "0.5.0", diff --git a/yarn.lock b/yarn.lock index 667ea7aaa3..c262f4ae40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2044,10 +2044,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@tryghost/helpers@1.1.43": - version "1.1.43" - resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.43.tgz#75e7677340e6f956db620cb7d29e8acadab4800d" - integrity sha512-Hviu65xnMG1w8j/ibTjqxoJyh4ZkCy2y3IURagZ16FfAiORKPYmGXbQb8ueDsazVnATfrhj1fzc18aTqf9w4lg== +"@tryghost/helpers@1.1.44": + version "1.1.44" + resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.44.tgz#9ac28624109ec4c84d51be369fc514266f5c65d0" + integrity sha512-oeCTguxn10/1mEqMUkuV+on7vJcO298KH+IEHY4RWCtUBkhsj3VBNqwfVcmuevhWx1h4uBNISP2AxsAIEdsIkw== dependencies: lodash-es "^4.17.11" From 69fa18479aba3e82a62c8d80d83dc1db5db3b9f8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 12:19:53 +0100 Subject: [PATCH 0264/3032] Update dependency @tryghost/string to v0.1.19 (#1959) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a417c079fb..d51cbcecac 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@tryghost/limit-service": "0.5.0", "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", - "@tryghost/string": "0.1.18", + "@tryghost/string": "0.1.19", "@tryghost/timezone-data": "0.2.41", "autoprefixer": "9.8.6", "babel-eslint": "10.1.0", diff --git a/yarn.lock b/yarn.lock index c262f4ae40..51c8485ca6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2086,10 +2086,10 @@ mobiledoc-dom-renderer "0.7.0" mobiledoc-text-renderer "0.4.0" -"@tryghost/string@0.1.18": - version "0.1.18" - resolved "https://registry.yarnpkg.com/@tryghost/string/-/string-0.1.18.tgz#2cc8f92ad80d055c872731dd5410383920e934cf" - integrity sha512-fIHteQ2plScj08OQrlDVfRZMCoocrSOmXkMC+TFe7WEIl/QFw2HKDWJeWxr6CADve2RUDzLJzJh71KL6u61bTw== +"@tryghost/string@0.1.19": + version "0.1.19" + resolved "https://registry.yarnpkg.com/@tryghost/string/-/string-0.1.19.tgz#b5a170cc118d7fcccc7c9e69c4f01faf626c4457" + integrity sha512-dmhGMhB/ZQPZVubKKOPoi6qXQClZCYLRbF3C1Ec1xNF+Fhd7W/7Wxz7PDYoMTSOhvelZb10XP8Uwuk9fos12HA== dependencies: unidecode "^0.1.8" From fd7b123bee146b744bbf7b569525fdd8b5ca386a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 12:20:13 +0100 Subject: [PATCH 0265/3032] Update dependency glob to v7.1.7 (#1952) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d51cbcecac..4f66dfe70b 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "eslint-plugin-ghost": "2.2.0", "faker": "5.5.3", "fs-extra": "10.0.0", - "glob": "7.1.6", + "glob": "7.1.7", "google-caja-bower": "https://github.com/acburdine/google-caja-bower#ghost", "grunt": "1.4.0", "grunt-shell": "3.0.1", diff --git a/yarn.lock b/yarn.lock index 51c8485ca6..c498e06147 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9124,10 +9124,10 @@ glob@3.2.11: inherits "2" minimatch "0.3" -glob@7.1.6, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -9147,6 +9147,18 @@ glob@^5.0.10, glob@~5.0.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.4, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" From bdcef3e45c1bc7a2849bfd65d8bfe917c0aab29c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 12:20:28 +0100 Subject: [PATCH 0266/3032] Update dependency ember-cli-babel to v7.26.5 (#1948) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4f66dfe70b..4a93c81aeb 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "ember-classic-decorator": "2.0.0", "ember-cli": "3.21.2", "ember-cli-app-version": "5.0.0", - "ember-cli-babel": "7.26.4", + "ember-cli-babel": "7.26.5", "ember-cli-chart": "3.7.2", "ember-cli-dependency-checker": "3.2.0", "ember-cli-deprecation-workflow": "1.0.1", diff --git a/yarn.lock b/yarn.lock index c498e06147..0844e933fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,10 +6265,10 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.26.4: - version "7.26.4" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.4.tgz#b73d53592c05479814ca1770b3b849d4e01a87f0" - integrity sha512-GibwLrBUVj8DxNMnbE5PObEIeznX6ohOdYHoSMmTkCBuXa/I9amRGIjBhNlDbAJj+exVKKZoEGAdrV13gnyftQ== +ember-cli-babel@7.26.5: + version "7.26.5" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" + integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" From 6267274f5693b2f0fdf3ca1997b973c37213700a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 12:20:51 +0100 Subject: [PATCH 0267/3032] Update dependency ember-test-selectors to v5.1.0 (#1953) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 45 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 4a93c81aeb..56d97d9d64 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "ember-sinon": "5.0.0", "ember-source": "3.21.3", "ember-svg-jar": "2.3.3", - "ember-test-selectors": "5.0.0", + "ember-test-selectors": "5.1.0", "ember-tooltips": "3.4.7", "ember-truth-helpers": "3.0.0", "ember-useragent": "0.10.0", diff --git a/yarn.lock b/yarn.lock index 0844e933fb..c4c48401b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6415,6 +6415,39 @@ ember-cli-babel@^7.23.1: rimraf "^3.0.1" semver "^5.5.0" +ember-cli-babel@^7.26.4: + version "7.26.5" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" + integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" + rimraf "^3.0.1" + semver "^5.5.0" + ember-cli-babel@~7.11.0: version "7.11.1" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.1.tgz#77bc8f4001d47b91d80e3d36a4754412616fc0d8" @@ -7531,14 +7564,14 @@ ember-svg-jar@2.3.3: mkdirp "^0.5.1" path-posix "^1.0.0" -ember-test-selectors@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-5.0.0.tgz#36c30f64498039cb88797cdda682275a460ee624" - integrity sha512-hqAPqyJLEGBYcQ9phOKvHhSCyvcSbUL8Yj2si8OASsQWxwRqbxrtk5YlkN2aZiZdp9PAd2wErS8uClG0U7tNpA== +ember-test-selectors@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-5.1.0.tgz#60c47ecee2dfe513eebe5c34565762eb67ce0530" + integrity sha512-gxK0ODCyKGnPahM3Ri3zbeoXVD7H06WRPrBr1gjjcul8MuD+e6B7kVcAnG6HlDNLFdlWARyZcFNI6fYCIYbgpg== dependencies: calculate-cache-key-for-tree "^2.0.0" - ember-cli-babel "^7.22.1" - ember-cli-version-checker "^5.1.1" + ember-cli-babel "^7.26.4" + ember-cli-version-checker "^5.1.2" ember-test-waiters@^1.1.1: version "1.2.0" From 9ed58cf559bf61a112ea9df1ec6829d96d599f7f Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 12 May 2021 12:27:15 +0100 Subject: [PATCH 0268/3032] Switch deprecated `{{hasBlock}}` to `(has-block)` no issue See https://github.com/emberjs/rfcs/blob/master/text/0689-deprecate-has-block.md --- app/components/gh-fullscreen-modal.hbs | 2 +- app/components/gh-infinity-loader.hbs | 2 +- app/components/gh-task-button.hbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/gh-fullscreen-modal.hbs b/app/components/gh-fullscreen-modal.hbs index afa065c16b..56f6d17115 100644 --- a/app/components/gh-fullscreen-modal.hbs +++ b/app/components/gh-fullscreen-modal.hbs @@ -1,7 +1,7 @@
    - {{#if hasBlock}} + {{#if (has-block)}} {{yield}} {{else}} {{#let (component this.modalPath) as |ModalComponent|}} diff --git a/app/components/gh-infinity-loader.hbs b/app/components/gh-infinity-loader.hbs index 8b591de350..50bdf67f91 100644 --- a/app/components/gh-infinity-loader.hbs +++ b/app/components/gh-infinity-loader.hbs @@ -4,7 +4,7 @@ class="{{this.loaderClassNames}}{{if this.viewportEntered " in-viewport"}}{{if this.isDoneLoading " reached-infinity"}}" data-test-infinity-loader> - {{#if hasBlock}} + {{#if (has-block)}} {{yield this.infinityModelContent}} {{else}} {{#if this.isDoneLoading}} diff --git a/app/components/gh-task-button.hbs b/app/components/gh-task-button.hbs index 2f5e5b8906..ba79ca37ed 100644 --- a/app/components/gh-task-button.hbs +++ b/app/components/gh-task-button.hbs @@ -1,4 +1,4 @@ -{{#if hasBlock}} +{{#if (has-block)}} {{yield (hash isIdle=this.isIdle isRunning=this.isRunning From 5be2cd998f86f67dd06aa05fc4a9ea0d68905195 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 12 May 2021 12:33:36 +0100 Subject: [PATCH 0269/3032] Switch deprecated htmlSafe imports from @ember/string to @ember/template no issue See https://deprecations.emberjs.com/v3.x#toc_ember-string-htmlsafe-ishtmlsafe --- app/components/gh-brand-settings-form.js | 2 +- app/components/gh-file-uploader.js | 2 +- app/components/gh-image-uploader.js | 2 +- app/components/gh-launch-wizard/finalise.js | 2 +- app/components/gh-markdown-editor.js | 2 +- app/components/gh-member-avatar.js | 2 +- app/components/gh-nav-menu/main.js | 2 +- app/components/gh-post-settings-menu/email.js | 2 +- app/components/gh-profile-image.js | 2 +- app/components/gh-progress-bar.js | 2 +- app/components/gh-skip-link.js | 2 +- app/components/gh-tag-settings-form.js | 2 +- app/components/gh-token-input.js | 2 +- app/components/gh-unsplash-photo.js | 2 +- app/components/modal-import-members.js | 2 +- app/components/modal-portal-settings.js | 2 +- app/components/modal-post-preview/email.js | 2 +- app/components/modal-re-authenticate.js | 2 +- app/controllers/editor.js | 2 +- app/controllers/integration.js | 2 +- app/controllers/settings/products.js | 2 +- app/controllers/setup/three.js | 2 +- app/controllers/signin.js | 2 +- app/helpers/background-image-style.js | 2 +- app/helpers/gh-count-characters.js | 2 +- app/helpers/gh-count-down-characters.js | 2 +- app/helpers/highlighted-text.js | 2 +- app/helpers/integration-icon-style.js | 2 +- app/routes/editor.js | 2 +- app/services/notifications.js | 3 ++- app/services/upgrade-status.js | 2 +- lib/koenig-editor/addon/components/koenig-card-code.js | 2 +- lib/koenig-editor/addon/components/koenig-card-gallery.js | 2 +- lib/koenig-editor/addon/components/koenig-card-markdown.js | 2 +- lib/koenig-editor/addon/components/koenig-card.js | 2 +- lib/koenig-editor/addon/components/koenig-link-input.js | 2 +- lib/koenig-editor/addon/components/koenig-link-toolbar.js | 2 +- lib/koenig-editor/addon/components/koenig-plus-menu.js | 2 +- lib/koenig-editor/addon/components/koenig-toolbar.js | 2 +- 39 files changed, 40 insertions(+), 39 deletions(-) diff --git a/app/components/gh-brand-settings-form.js b/app/components/gh-brand-settings-form.js index 6cfc6005a6..f24c98a84c 100644 --- a/app/components/gh-brand-settings-form.js +++ b/app/components/gh-brand-settings-form.js @@ -7,7 +7,7 @@ import { IMAGE_MIME_TYPES } from 'ghost-admin/components/gh-image-uploader'; import {action} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; import {timeout} from 'ember-concurrency'; diff --git a/app/components/gh-file-uploader.js b/app/components/gh-file-uploader.js index 4d490afd26..7de8101927 100644 --- a/app/components/gh-file-uploader.js +++ b/app/components/gh-file-uploader.js @@ -6,7 +6,7 @@ import { isVersionMismatchError } from 'ghost-admin/services/ajax'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isBlank} from '@ember/utils'; import {isArray as isEmberArray} from '@ember/array'; import {run} from '@ember/runloop'; diff --git a/app/components/gh-image-uploader.js b/app/components/gh-image-uploader.js index e7444b621e..5870c8d8fd 100644 --- a/app/components/gh-image-uploader.js +++ b/app/components/gh-image-uploader.js @@ -8,7 +8,7 @@ import { } from 'ghost-admin/services/ajax'; import {computed} from '@ember/object'; import {get} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isArray} from '@ember/array'; import {isBlank} from '@ember/utils'; import {isArray as isEmberArray} from '@ember/array'; diff --git a/app/components/gh-launch-wizard/finalise.js b/app/components/gh-launch-wizard/finalise.js index b7436f94c9..1c9fc6b8ec 100644 --- a/app/components/gh-launch-wizard/finalise.js +++ b/app/components/gh-launch-wizard/finalise.js @@ -1,5 +1,5 @@ import Component from '@glimmer/component'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; diff --git a/app/components/gh-markdown-editor.js b/app/components/gh-markdown-editor.js index b860d1488e..eb555477f2 100644 --- a/app/components/gh-markdown-editor.js +++ b/app/components/gh-markdown-editor.js @@ -4,7 +4,7 @@ import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd'; import formatMarkdown from 'ghost-admin/utils/format-markdown'; import {assign} from '@ember/polyfills'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isEmpty, typeOf} from '@ember/utils'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/app/components/gh-member-avatar.js b/app/components/gh-member-avatar.js index 1e8d0344f2..f027b672ec 100644 --- a/app/components/gh-member-avatar.js +++ b/app/components/gh-member-avatar.js @@ -1,5 +1,5 @@ import Component from '@glimmer/component'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; const stringToHslColor = function (str, saturation, lightness) { var hash = 0; diff --git a/app/components/gh-nav-menu/main.js b/app/components/gh-nav-menu/main.js index 2f5b5ec7db..c8a9b89c3d 100644 --- a/app/components/gh-nav-menu/main.js +++ b/app/components/gh-nav-menu/main.js @@ -4,7 +4,7 @@ import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd'; import {and, equal, match, or} from '@ember/object/computed'; import {computed} from '@ember/object'; import {getOwner} from '@ember/application'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency'; diff --git a/app/components/gh-post-settings-menu/email.js b/app/components/gh-post-settings-menu/email.js index 02510f5c9c..eae921e842 100644 --- a/app/components/gh-post-settings-menu/email.js +++ b/app/components/gh-post-settings-menu/email.js @@ -4,7 +4,7 @@ import validator from 'validator'; import {action} from '@ember/object'; import {alias, not, oneWay, or} from '@ember/object/computed'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {inject as service} from '@ember/service'; import {task, timeout} from 'ember-concurrency'; diff --git a/app/components/gh-profile-image.js b/app/components/gh-profile-image.js index b0de460edd..54f3f6b978 100644 --- a/app/components/gh-profile-image.js +++ b/app/components/gh-profile-image.js @@ -3,7 +3,7 @@ import Component from '@ember/component'; import md5 from 'blueimp-md5'; import request from 'ember-ajax/request'; import validator from 'validator'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {inject as service} from '@ember/service'; import {task, timeout} from 'ember-concurrency'; diff --git a/app/components/gh-progress-bar.js b/app/components/gh-progress-bar.js index d6be2cb36e..a27c4655a9 100644 --- a/app/components/gh-progress-bar.js +++ b/app/components/gh-progress-bar.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; export default Component.extend({ tagName: '', diff --git a/app/components/gh-skip-link.js b/app/components/gh-skip-link.js index 281390cdb9..04e8efe9fc 100644 --- a/app/components/gh-skip-link.js +++ b/app/components/gh-skip-link.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; export default Component.extend({ tagName: 'a', diff --git a/app/components/gh-tag-settings-form.js b/app/components/gh-tag-settings-form.js index 7284faabdf..59a6e2d2ec 100644 --- a/app/components/gh-tag-settings-form.js +++ b/app/components/gh-tag-settings-form.js @@ -1,7 +1,7 @@ import Component from '@ember/component'; import Ember from 'ember'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {or} from '@ember/object/computed'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/app/components/gh-token-input.js b/app/components/gh-token-input.js index f5704b3854..049eeb44a5 100644 --- a/app/components/gh-token-input.js +++ b/app/components/gh-token-input.js @@ -10,7 +10,7 @@ import { defaultMatcher, filterOptions } from 'ember-power-select/utils/group-utils'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isBlank} from '@ember/utils'; import {tagName} from '@ember-decorators/component'; import {task} from 'ember-concurrency-decorators'; diff --git a/app/components/gh-unsplash-photo.js b/app/components/gh-unsplash-photo.js index 5eccc210ab..22c682112f 100644 --- a/app/components/gh-unsplash-photo.js +++ b/app/components/gh-unsplash-photo.js @@ -1,7 +1,7 @@ import $ from 'jquery'; import Component from '@ember/component'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {run} from '@ember/runloop'; export default Component.extend({ diff --git a/app/components/modal-import-members.js b/app/components/modal-import-members.js index 65861a9a98..27c3e2ae1d 100644 --- a/app/components/modal-import-members.js +++ b/app/components/modal-import-members.js @@ -9,7 +9,7 @@ import { isVersionMismatchError } from 'ghost-admin/services/ajax'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isBlank} from '@ember/utils'; import {inject as service} from '@ember/service'; diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index 2ed08d21fc..d189c3ffe6 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -2,7 +2,7 @@ import $ from 'jquery'; import ModalComponent from 'ghost-admin/components/modal-base'; import copyTextToClipboard from 'ghost-admin/utils/copy-text-to-clipboard'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {reads} from '@ember/object/computed'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/app/components/modal-post-preview/email.js b/app/components/modal-post-preview/email.js index cee0443285..d0bafc9f77 100644 --- a/app/components/modal-post-preview/email.js +++ b/app/components/modal-post-preview/email.js @@ -1,7 +1,7 @@ import Component from '@glimmer/component'; import validator from 'validator'; import {action} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; import {timeout} from 'ember-concurrency'; diff --git a/app/components/modal-re-authenticate.js b/app/components/modal-re-authenticate.js index 839d2fe5b1..65f11df14e 100644 --- a/app/components/modal-re-authenticate.js +++ b/app/components/modal-re-authenticate.js @@ -1,7 +1,7 @@ import $ from 'jquery'; import ModalComponent from 'ghost-admin/components/modal-base'; import ValidationEngine from 'ghost-admin/mixins/validation-engine'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isVersionMismatchError} from 'ghost-admin/services/ajax'; import {reads} from '@ember/object/computed'; import {inject as service} from '@ember/service'; diff --git a/app/controllers/editor.js b/app/controllers/editor.js index bbf73c8b1a..d945675992 100644 --- a/app/controllers/editor.js +++ b/app/controllers/editor.js @@ -9,7 +9,7 @@ import {alias, mapBy} from '@ember/object/computed'; import {capitalize} from '@ember/string'; import {inject as controller} from '@ember/controller'; import {get} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isBlank} from '@ember/utils'; import {isArray as isEmberArray} from '@ember/array'; import {isHostLimitError} from 'ghost-admin/services/ajax'; diff --git a/app/controllers/integration.js b/app/controllers/integration.js index 80ef15505a..b9adbd0551 100644 --- a/app/controllers/integration.js +++ b/app/controllers/integration.js @@ -7,7 +7,7 @@ import { } from 'ghost-admin/components/gh-image-uploader'; import {alias} from '@ember/object/computed'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {inject as service} from '@ember/service'; import {task, timeout} from 'ember-concurrency'; diff --git a/app/controllers/settings/products.js b/app/controllers/settings/products.js index ad746c2028..e0ead16e03 100644 --- a/app/controllers/settings/products.js +++ b/app/controllers/settings/products.js @@ -1,6 +1,6 @@ import Controller from '@ember/controller'; import {action} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {inject as service} from '@ember/service'; import {tracked} from '@glimmer/tracking'; diff --git a/app/controllers/setup/three.js b/app/controllers/setup/three.js index 9e3973d390..b624ec2e18 100644 --- a/app/controllers/setup/three.js +++ b/app/controllers/setup/three.js @@ -9,7 +9,7 @@ import validator from 'validator'; import {alias} from '@ember/object/computed'; import {computed} from '@ember/object'; import {A as emberA} from '@ember/array'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isInvalidError} from 'ember-ajax/errors'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/app/controllers/signin.js b/app/controllers/signin.js index 6d11e91c18..9f12b41bb8 100644 --- a/app/controllers/signin.js +++ b/app/controllers/signin.js @@ -3,7 +3,7 @@ import Controller, {inject as controller} from '@ember/controller'; import ValidationEngine from 'ghost-admin/mixins/validation-engine'; import {alias} from '@ember/object/computed'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isArray as isEmberArray} from '@ember/array'; import {isVersionMismatchError} from 'ghost-admin/services/ajax'; import {inject as service} from '@ember/service'; diff --git a/app/helpers/background-image-style.js b/app/helpers/background-image-style.js index 17e4cb466b..d9ab8d40d0 100644 --- a/app/helpers/background-image-style.js +++ b/app/helpers/background-image-style.js @@ -1,5 +1,5 @@ import {helper} from '@ember/component/helper'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; export function backgroundImageStyle([url]/*, hash*/) { if (url) { diff --git a/app/helpers/gh-count-characters.js b/app/helpers/gh-count-characters.js index 567766b7f2..393dc9045e 100644 --- a/app/helpers/gh-count-characters.js +++ b/app/helpers/gh-count-characters.js @@ -1,5 +1,5 @@ import {helper} from '@ember/component/helper'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; export function countCharacters(params) { if (!params || !params.length) { diff --git a/app/helpers/gh-count-down-characters.js b/app/helpers/gh-count-down-characters.js index 01f7a7e68b..f9386e527f 100644 --- a/app/helpers/gh-count-down-characters.js +++ b/app/helpers/gh-count-down-characters.js @@ -1,5 +1,5 @@ import {helper} from '@ember/component/helper'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; export function countDownCharacters(params) { if (!params || params.length < 2) { diff --git a/app/helpers/highlighted-text.js b/app/helpers/highlighted-text.js index 12ef0cedbe..cb6d3c40aa 100644 --- a/app/helpers/highlighted-text.js +++ b/app/helpers/highlighted-text.js @@ -1,5 +1,5 @@ import {helper} from '@ember/component/helper'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; export function highlightedText([text, termToHighlight]) { // replace any non-word character with an escaped character diff --git a/app/helpers/integration-icon-style.js b/app/helpers/integration-icon-style.js index b3175ffc30..18a769e889 100644 --- a/app/helpers/integration-icon-style.js +++ b/app/helpers/integration-icon-style.js @@ -1,5 +1,5 @@ import {helper} from '@ember/component/helper'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; export function integrationLogoStyle([integration]/*, hash*/) { if (integration.iconImage) { diff --git a/app/routes/editor.js b/app/routes/editor.js index ac01636d96..238f2a39db 100644 --- a/app/routes/editor.js +++ b/app/routes/editor.js @@ -2,7 +2,7 @@ import $ from 'jquery'; import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; import ShortcutsRoute from 'ghost-admin/mixins/shortcuts-route'; import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/app/services/notifications.js b/app/services/notifications.js index 29f71f61bf..2ed0290023 100644 --- a/app/services/notifications.js +++ b/app/services/notifications.js @@ -1,8 +1,9 @@ import Service, {inject as service} from '@ember/service'; -import {dasherize, htmlSafe} from '@ember/string'; +import {dasherize} from '@ember/string'; import {A as emberA, isArray as isEmberArray} from '@ember/array'; import {filter} from '@ember/object/computed'; import {get, set} from '@ember/object'; +import {htmlSafe} from '@ember/template'; import {isBlank} from '@ember/utils'; import { isMaintenanceError, diff --git a/app/services/upgrade-status.js b/app/services/upgrade-status.js index 861815565d..0bb4036e4f 100644 --- a/app/services/upgrade-status.js +++ b/app/services/upgrade-status.js @@ -1,6 +1,6 @@ import Service, {inject as service} from '@ember/service'; import {get, set} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; export default Service.extend({ notifications: service(), diff --git a/lib/koenig-editor/addon/components/koenig-card-code.js b/lib/koenig-editor/addon/components/koenig-card-code.js index 46360026ff..cb7b228c9d 100644 --- a/lib/koenig-editor/addon/components/koenig-card-code.js +++ b/lib/koenig-editor/addon/components/koenig-card-code.js @@ -2,7 +2,7 @@ import Component from '@ember/component'; import Ember from 'ember'; import {computed} from '@ember/object'; import {utils as ghostHelperUtils} from '@tryghost/helpers'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isBlank} from '@ember/utils'; import {run} from '@ember/runloop'; import {set} from '@ember/object'; diff --git a/lib/koenig-editor/addon/components/koenig-card-gallery.js b/lib/koenig-editor/addon/components/koenig-card-gallery.js index 700cfd3420..eebf6ab650 100644 --- a/lib/koenig-editor/addon/components/koenig-card-gallery.js +++ b/lib/koenig-editor/addon/components/koenig-card-gallery.js @@ -6,7 +6,7 @@ import { IMAGE_MIME_TYPES } from 'ghost-admin/components/gh-image-uploader'; import {utils as ghostHelperUtils} from '@tryghost/helpers'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isEmpty} from '@ember/utils'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/lib/koenig-editor/addon/components/koenig-card-markdown.js b/lib/koenig-editor/addon/components/koenig-card-markdown.js index 71331cd21f..7ce856ac11 100644 --- a/lib/koenig-editor/addon/components/koenig-card-markdown.js +++ b/lib/koenig-editor/addon/components/koenig-card-markdown.js @@ -2,7 +2,7 @@ import Component from '@ember/component'; import formatMarkdown from 'ghost-admin/utils/format-markdown'; import {computed} from '@ember/object'; import {utils as ghostHelperUtils} from '@tryghost/helpers'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {isBlank} from '@ember/utils'; import {run} from '@ember/runloop'; import {set} from '@ember/object'; diff --git a/lib/koenig-editor/addon/components/koenig-card.js b/lib/koenig-editor/addon/components/koenig-card.js index 10b075b87d..a89f30d247 100644 --- a/lib/koenig-editor/addon/components/koenig-card.js +++ b/lib/koenig-editor/addon/components/koenig-card.js @@ -1,7 +1,7 @@ import Browser from 'mobiledoc-kit/utils/browser'; import Component from '@ember/component'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/lib/koenig-editor/addon/components/koenig-link-input.js b/lib/koenig-editor/addon/components/koenig-link-input.js index 8e71335694..9131aa034d 100644 --- a/lib/koenig-editor/addon/components/koenig-link-input.js +++ b/lib/koenig-editor/addon/components/koenig-link-input.js @@ -4,7 +4,7 @@ import relativeToAbsolute from '../lib/relative-to-absolute'; import {TOOLBAR_MARGIN} from './koenig-toolbar'; import {computed} from '@ember/object'; import {getLinkMarkupFromRange} from '../utils/markup-utils'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/lib/koenig-editor/addon/components/koenig-link-toolbar.js b/lib/koenig-editor/addon/components/koenig-link-toolbar.js index 6cd323cf67..dcf094f0a2 100644 --- a/lib/koenig-editor/addon/components/koenig-link-toolbar.js +++ b/lib/koenig-editor/addon/components/koenig-link-toolbar.js @@ -2,7 +2,7 @@ import Component from '@ember/component'; import relativeToAbsolute from '../lib/relative-to-absolute'; import {computed} from '@ember/object'; import {getEventTargetMatchingTag} from 'mobiledoc-kit/utils/element-utils'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; diff --git a/lib/koenig-editor/addon/components/koenig-plus-menu.js b/lib/koenig-editor/addon/components/koenig-plus-menu.js index 421431d422..5d9b55a933 100644 --- a/lib/koenig-editor/addon/components/koenig-plus-menu.js +++ b/lib/koenig-editor/addon/components/koenig-plus-menu.js @@ -3,7 +3,7 @@ import mobiledocParsers from 'mobiledoc-kit/parsers/mobiledoc'; import snippetIcon from '../utils/snippet-icon'; import {CARD_MENU} from '../options/cards'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {run} from '@ember/runloop'; export default Component.extend({ diff --git a/lib/koenig-editor/addon/components/koenig-toolbar.js b/lib/koenig-editor/addon/components/koenig-toolbar.js index 1c1ef5f9bf..f13cd79177 100644 --- a/lib/koenig-editor/addon/components/koenig-toolbar.js +++ b/lib/koenig-editor/addon/components/koenig-toolbar.js @@ -1,6 +1,6 @@ import Component from '@ember/component'; import {computed} from '@ember/object'; -import {htmlSafe} from '@ember/string'; +import {htmlSafe} from '@ember/template'; import {run} from '@ember/runloop'; import {task, timeout} from 'ember-concurrency'; From 8e491ec2b234bdddd3fda5028e6c8de0109a659f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 12:41:31 +0100 Subject: [PATCH 0270/3032] Update dependency @tryghost/timezone-data to v0.2.42 (#1960) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 43 +++++-------------------------------------- 2 files changed, 6 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index 56d97d9d64..530c81c464 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.19", - "@tryghost/timezone-data": "0.2.41", + "@tryghost/timezone-data": "0.2.42", "autoprefixer": "9.8.6", "babel-eslint": "10.1.0", "blueimp-md5": "2.18.0", diff --git a/yarn.lock b/yarn.lock index c4c48401b4..739e1a9ad5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2093,10 +2093,10 @@ dependencies: unidecode "^0.1.8" -"@tryghost/timezone-data@0.2.41": - version "0.2.41" - resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.41.tgz#ab8251c65c867120ab927237513c56594c18a3be" - integrity sha512-mpXrEJyTBMqaq4K4cuPfrGR8f149f+puIrRJc0bxazMbFeEAXsFQwBsKMN/aw4xh4F6y3jmNjaQeEXfr4cP5sw== +"@tryghost/timezone-data@0.2.42": + version "0.2.42" + resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.42.tgz#dcd59e2262e73a2df3aa7de28354f1eb41d483ad" + integrity sha512-2nt7gGougbkIvZgnhh3hBCLjcWgXIDGc+dM8Ixwhl0uo8fx/8OHM88UoDHkpgvz8Z8LNS7c33/stveIEO/HO2A== "@types/acorn@^4.0.3": version "4.0.5" @@ -6265,7 +6265,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.26.5: +ember-cli-babel@7.26.5, ember-cli-babel@^7.26.4: version "7.26.5" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== @@ -6415,39 +6415,6 @@ ember-cli-babel@^7.23.1: rimraf "^3.0.1" semver "^5.5.0" -ember-cli-babel@^7.26.4: - version "7.26.5" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" - integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== - dependencies: - "@babel/core" "^7.12.0" - "@babel/helper-compilation-targets" "^7.12.0" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-decorators" "^7.13.5" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-runtime" "^7.13.9" - "@babel/plugin-transform-typescript" "^7.13.0" - "@babel/polyfill" "^7.11.5" - "@babel/preset-env" "^7.12.0" - "@babel/runtime" "7.12.18" - amd-name-resolver "^1.3.1" - babel-plugin-debug-macros "^0.3.4" - babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.5.0" - babel-plugin-module-resolver "^3.2.0" - broccoli-babel-transpiler "^7.8.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.2" - broccoli-source "^2.1.2" - clone "^2.1.2" - ember-cli-babel-plugin-helpers "^1.1.1" - ember-cli-version-checker "^4.1.0" - ensure-posix-path "^1.0.2" - fixturify-project "^1.10.0" - resolve-package-path "^3.1.0" - rimraf "^3.0.1" - semver "^5.5.0" - ember-cli-babel@~7.11.0: version "7.11.1" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.1.tgz#77bc8f4001d47b91d80e3d36a4754412616fc0d8" From eddbe5ba649c4b5549c0593fbc0378251c8c50d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 12:43:08 +0100 Subject: [PATCH 0271/3032] Update dependency ember-infinity to v2.2.0 (#1950) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 746 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 705 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 530c81c464..e859d562e8 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "ember-export-application-global": "2.0.1", "ember-fetch": "8.0.4", "ember-in-viewport": "3.9.0", - "ember-infinity": "2.1.2", + "ember-infinity": "2.2.0", "ember-keyboard": "6.0.2", "ember-load": "0.0.17", "ember-load-initializers": "2.1.2", diff --git a/yarn.lock b/yarn.lock index 739e1a9ad5..f8e2638004 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,6 +26,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1" integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== + "@babel/compat-data@^7.13.15": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" @@ -52,7 +57,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.12.16": +"@babel/core@^7.12.16", "@babel/core@^7.9.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== @@ -146,6 +151,13 @@ dependencies: "@babel/types" "^7.12.10" +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" @@ -154,6 +166,14 @@ "@babel/helper-explode-assignable-expression" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" @@ -174,7 +194,7 @@ browserslist "^4.14.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.13.16": +"@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8", "@babel/helper-compilation-targets@^7.8.7": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== @@ -206,6 +226,18 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" +"@babel/helper-create-class-features-plugin@^7.13.11", "@babel/helper-create-class-features-plugin@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.1.tgz#1fe11b376f3c41650ad9fedc665b0068722ea76c" + integrity sha512-r8rsUahG4ywm0QpGcCrLaUSOuNAISR3IZCg4Fx05Ozq31aCUrQsTLH6KPxy0N5ULoQ4Sn9qjNdGNtbPWAC6hYg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-create-regexp-features-plugin@^7.12.1": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" @@ -214,6 +246,14 @@ "@babel/helper-annotate-as-pure" "^7.10.4" regexpu-core "^4.7.1" +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" + integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" + "@babel/helper-define-map@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" @@ -237,6 +277,20 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" + integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-explode-assignable-expression@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" @@ -244,6 +298,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" + integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== + dependencies: + "@babel/types" "^7.13.0" + "@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" @@ -283,6 +344,14 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-hoist-variables@^7.13.0": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" + integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== + dependencies: + "@babel/traverse" "^7.13.15" + "@babel/types" "^7.13.16" + "@babel/helper-member-expression-to-functions@^7.12.1", "@babel/helper-member-expression-to-functions@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" @@ -401,6 +470,15 @@ "@babel/helper-wrap-function" "^7.10.4" "@babel/types" "^7.12.1" +"@babel/helper-remap-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" + integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.13.0" + "@babel/types" "^7.13.0" + "@babel/helper-replace-supers@^7.12.1": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz#ea511658fc66c7908f923106dd88e08d1997d60d" @@ -411,7 +489,7 @@ "@babel/traverse" "^7.12.10" "@babel/types" "^7.12.11" -"@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== @@ -486,6 +564,16 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-wrap-function@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" + integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + "@babel/helpers@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" @@ -551,6 +639,15 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" + integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566" @@ -560,7 +657,16 @@ "@babel/helper-remap-async-to-generator" "^7.12.1" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.3.4": +"@babel/plugin-proposal-async-generator-functions@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" + integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== @@ -568,7 +674,7 @@ "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-class-properties@^7.13.0": +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.8.3": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== @@ -576,7 +682,15 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-decorators@^7.10.5", "@babel/plugin-proposal-decorators@^7.3.0": +"@babel/plugin-proposal-class-static-block@^7.13.11": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz#6fcbba4a962702c17e5371a0c7b39afde186d703" + integrity sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-class-static-block" "^7.12.13" + +"@babel/plugin-proposal-decorators@^7.10.5": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.12.tgz#067a6d3d6ca86d54cf56bb183239199c20daeafe" integrity sha512-fhkE9lJYpw2mjHelBpM2zCbaA11aov2GJs7q4cFaXNrWx0H3bW58H9Esy2rdtYOghFBEYUDRIpvlgi+ZD+AvvQ== @@ -594,6 +708,15 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-decorators" "^7.12.13" +"@babel/plugin-proposal-decorators@^7.8.3": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz#e91ccfef2dc24dd5bd5dcc9fc9e2557c684ecfb8" + integrity sha512-ibAMAqUm97yzi+LPgdr5Nqb9CMkeieGHvwPg1ywSGjZrZHQEGqE01HmOio8kxRpA/+VtOHouIVy2FMpBbtltjA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.11" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-decorators" "^7.12.13" + "@babel/plugin-proposal-dynamic-import@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" @@ -602,6 +725,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" +"@babel/plugin-proposal-dynamic-import@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" + integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-export-namespace-from@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" @@ -610,6 +741,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" @@ -618,6 +757,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" +"@babel/plugin-proposal-json-strings@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" + integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-proposal-logical-assignment-operators@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" @@ -626,6 +773,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" + integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" @@ -634,6 +789,22 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" + integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" @@ -651,6 +822,17 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.12.1" +"@babel/plugin-proposal-object-rest-spread@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" + integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== + dependencies: + "@babel/compat-data" "^7.13.8" + "@babel/helper-compilation-targets" "^7.13.8" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-proposal-optional-catch-binding@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" @@ -659,6 +841,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" +"@babel/plugin-proposal-optional-catch-binding@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" + integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.6.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" @@ -668,6 +858,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" +"@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" + integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-methods@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" @@ -676,6 +875,24 @@ "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" + integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-proposal-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" + integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" @@ -684,7 +901,15 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-async-generators@^7.8.0": +"@babel/plugin-proposal-unicode-property-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== @@ -698,6 +923,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" + integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-decorators@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz#81a8b535b284476c41be6de06853a8802b98c5dd" @@ -726,7 +965,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-json-strings@^7.8.0": +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== @@ -740,7 +979,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== @@ -754,27 +993,34 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0": +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" + integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-top-level-await@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" @@ -782,6 +1028,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-top-level-await@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-typescript@^7.12.1", "@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5" @@ -803,6 +1056,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-arrow-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" + integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-transform-async-to-generator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" @@ -812,6 +1072,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-remap-async-to-generator" "^7.12.1" +"@babel/plugin-transform-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" + integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/plugin-transform-block-scoped-functions@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" @@ -819,6 +1088,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-block-scoping@^7.12.11", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz#d93a567a152c22aea3b1929bb118d1d0a175cdca" @@ -826,6 +1102,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-block-scoping@^7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.1.tgz#ac1b3a8e3d8cbb31efc6b9be2f74eb9823b74ab2" + integrity sha512-2mQXd0zBrwfp0O1moWIhPpEeTKDvxyHcnma3JATVP1l+CctWBuot6OJG8LQ4DnBj4ZZPSmlb/fm4mu47EOAnVA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-transform-classes@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" @@ -840,6 +1123,19 @@ "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" + integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" @@ -847,6 +1143,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-computed-properties@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" + integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-transform-destructuring@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" @@ -854,6 +1157,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-destructuring@^7.13.17": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" + integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" @@ -862,6 +1172,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-dotall-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-duplicate-keys@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" @@ -869,6 +1187,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" @@ -877,6 +1202,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-for-of@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" @@ -884,6 +1217,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-for-of@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" + integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-transform-function-name@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" @@ -892,6 +1232,14 @@ "@babel/helper-function-name" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" @@ -899,6 +1247,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-member-expression-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" @@ -906,7 +1261,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.10.5", "@babel/plugin-transform-modules-amd@^7.12.1": +"@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-modules-amd@^7.10.5", "@babel/plugin-transform-modules-amd@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== @@ -924,6 +1286,15 @@ "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.14.0", "@babel/plugin-transform-modules-amd@^7.9.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz#589494b5b290ff76cf7f59c798011f6d77026553" + integrity sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ== + dependencies: + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-commonjs@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" @@ -934,6 +1305,16 @@ "@babel/helper-simple-access" "^7.12.1" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" + integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== + dependencies: + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-simple-access" "^7.13.12" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" @@ -945,6 +1326,17 @@ "@babel/helper-validator-identifier" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-systemjs@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" + integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== + dependencies: + "@babel/helper-hoist-variables" "^7.13.0" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-identifier" "^7.12.11" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-umd@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" @@ -953,6 +1345,14 @@ "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-modules-umd@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" + integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== + dependencies: + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" @@ -960,6 +1360,13 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.1" +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/plugin-transform-new-target@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" @@ -967,6 +1374,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-object-assign@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.1.tgz#9102b06625f60a5443cc292d32b565373665e1e4" @@ -982,6 +1396,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-replace-supers" "^7.12.1" +"@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/plugin-transform-parameters@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" @@ -989,6 +1411,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-parameters@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" + integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-transform-property-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" @@ -996,6 +1425,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-regenerator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" @@ -1003,6 +1439,13 @@ dependencies: regenerator-transform "^0.14.2" +"@babel/plugin-transform-regenerator@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" + integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== + dependencies: + regenerator-transform "^0.14.2" + "@babel/plugin-transform-reserved-words@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" @@ -1010,7 +1453,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-runtime@^7.12.0", "@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.2.0": +"@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-runtime@^7.12.0", "@babel/plugin-transform-runtime@^7.12.1": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz#af0fded4e846c4b37078e8e5d06deac6cd848562" integrity sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA== @@ -1031,6 +1481,18 @@ babel-plugin-polyfill-regenerator "^0.1.2" semver "^6.3.0" +"@babel/plugin-transform-runtime@^7.9.0": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" + integrity sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + semver "^6.3.0" + "@babel/plugin-transform-shorthand-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" @@ -1038,6 +1500,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-spread@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" @@ -1046,6 +1515,21 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" +"@babel/plugin-transform-spread@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" + integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-sticky-regex@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" @@ -1060,6 +1544,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-template-literals@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" + integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-transform-typeof-symbol@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b" @@ -1067,6 +1558,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-typescript@^7.12.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4" @@ -1076,7 +1574,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-typescript" "^7.12.1" -"@babel/plugin-transform-typescript@^7.13.0": +"@babel/plugin-transform-typescript@^7.13.0", "@babel/plugin-transform-typescript@^7.9.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== @@ -1118,6 +1616,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-unicode-regex@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" @@ -1126,7 +1631,15 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.11.5", "@babel/polyfill@^7.4.0": +"@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/polyfill@^7.11.5", "@babel/polyfill@^7.4.0", "@babel/polyfill@^7.8.7": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" integrity sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g== @@ -1134,7 +1647,7 @@ core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.10.2", "@babel/preset-env@^7.12.0": +"@babel/preset-env@^7.10.2", "@babel/preset-env@^7.12.0": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== @@ -1206,7 +1719,86 @@ core-js-compat "^3.8.0" semver "^5.5.0" -"@babel/preset-modules@^0.1.3": +"@babel/preset-env@^7.9.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.1.tgz#b55914e2e68885ea03f69600b2d3537e54574a93" + integrity sha512-0M4yL1l7V4l+j/UHvxcdvNfLB9pPtIooHTbEhgD/6UGyh8Hy3Bm1Mj0buzjDXATCSz3JFibVdnoJZCrlUCanrQ== + dependencies: + "@babel/compat-data" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-async-generator-functions" "^7.13.15" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-class-static-block" "^7.13.11" + "@babel/plugin-proposal-dynamic-import" "^7.13.8" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.13.8" + "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.13.8" + "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-private-property-in-object" "^7.14.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.13.0" + "@babel/plugin-transform-async-to-generator" "^7.13.0" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.14.1" + "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-computed-properties" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.13.17" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.13.0" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.14.0" + "@babel/plugin-transform-modules-commonjs" "^7.14.0" + "@babel/plugin-transform-modules-systemjs" "^7.13.8" + "@babel/plugin-transform-modules-umd" "^7.14.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.13.15" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.13.0" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.13.0" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.14.1" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + core-js-compat "^3.9.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== @@ -1224,13 +1816,20 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.9.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.4", "@babel/template@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" @@ -3208,6 +3807,15 @@ babel-plugin-polyfill-corejs2@^0.1.4: "@babel/helper-define-polyfill-provider" "^0.1.5" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" + integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.0" + semver "^6.1.1" + babel-plugin-polyfill-corejs3@^0.1.3: version "0.1.7" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" @@ -3216,6 +3824,14 @@ babel-plugin-polyfill-corejs3@^0.1.3: "@babel/helper-define-polyfill-provider" "^0.1.5" core-js-compat "^3.8.1" +babel-plugin-polyfill-corejs3@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" + integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + core-js-compat "^3.9.1" + babel-plugin-polyfill-regenerator@^0.1.2: version "0.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f" @@ -3223,6 +3839,13 @@ babel-plugin-polyfill-regenerator@^0.1.2: dependencies: "@babel/helper-define-polyfill-provider" "^0.1.5" +babel-plugin-polyfill-regenerator@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" + integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -3826,7 +4449,7 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.3.0, broccoli-babel-transpiler@^7.7.0, broccoli-babel-transpiler@^7.8.0: +broccoli-babel-transpiler@^7.4.0, broccoli-babel-transpiler@^7.7.0, broccoli-babel-transpiler@^7.8.0: version "7.8.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.8.0.tgz#7e0f01fce5739f49bbadeee7f1e625ca51cad66e" integrity sha512-dv30Td5uL7dO3NzQUqQKQs+Iq7JGKnCNtvc6GBO76uVPqGnRlsQZcYqdBVr33JrctR+ZrpTUf7TjsFKeDRFA8Q== @@ -4617,6 +5240,17 @@ browserslist@^4.16.3: escalade "^3.1.1" node-releases "^1.1.70" +browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -4788,6 +5422,11 @@ caniuse-lite@^1.0.30001181: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz#256c85709a348ec4d175e847a3b515c66e79f2aa" integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== +caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -5164,6 +5803,11 @@ colorette@^1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -5405,6 +6049,14 @@ core-js-compat@^3.8.1: browserslist "^4.16.3" semver "7.0.0" +core-js-compat@^3.9.0, core-js-compat@^3.9.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.12.1.tgz#2c302c4708505fa7072b0adb5156d26f7801a18b" + integrity sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ== + dependencies: + browserslist "^4.16.6" + semver "7.0.0" + core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" @@ -6084,6 +6736,11 @@ electron-to-chromium@^1.3.649: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.699.tgz#854eea9db8bc8109c409a4807bfdb200dd75a2c7" integrity sha512-fjt43CPXdPYwD9ybmKbNeLwZBmCVdLY2J5fGZub7/eMPuiqQznOGNXv/wurnpXIlE7ScHnvG9Zi+H4/i6uMKmw== +electron-to-chromium@^1.3.723: + version "1.3.727" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" + integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== + element-closest@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/element-closest/-/element-closest-2.0.2.tgz#72a740a107453382e28df9ce5dbb5a8df0f966ec" @@ -6415,31 +7072,36 @@ ember-cli-babel@^7.23.1: rimraf "^3.0.1" semver "^5.5.0" -ember-cli-babel@~7.11.0: - version "7.11.1" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.11.1.tgz#77bc8f4001d47b91d80e3d36a4754412616fc0d8" - integrity sha512-Qgd7y9NVbRLEtwjBW/vPHXdTQrIgfgoCSFHfvBpEmLuWSWNpE/J6qwXrSbB9nEIlfzyjH0Almv4m0jwuJsB3ow== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.3.4" - "@babel/plugin-proposal-decorators" "^7.3.0" - "@babel/plugin-transform-modules-amd" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.2.0" - "@babel/polyfill" "^7.0.0" - "@babel/preset-env" "^7.0.0" - "@babel/runtime" "^7.2.0" +ember-cli-babel@~7.19.0: + version "7.19.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.19.0.tgz#e6eddea18a867231fcf90a80689e92b98be9a63b" + integrity sha512-HiWKuoyy35vGEr+iCw6gUnQ3pS5qslyTlKEDW8cVoMbvZNGYBgRxHed5nklVUh+BS74AwR9lsp25BTAagYAP9Q== + dependencies: + "@babel/core" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/plugin-proposal-class-properties" "^7.8.3" + "@babel/plugin-proposal-decorators" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-runtime" "^7.9.0" + "@babel/plugin-transform-typescript" "^7.9.0" + "@babel/polyfill" "^7.8.7" + "@babel/preset-env" "^7.9.0" + "@babel/runtime" "^7.9.0" amd-name-resolver "^1.2.1" babel-plugin-debug-macros "^0.3.0" + babel-plugin-ember-data-packages-polyfill "^0.1.2" babel-plugin-ember-modules-api-polyfill "^2.12.0" babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.3.0" + broccoli-babel-transpiler "^7.4.0" broccoli-debug "^0.6.4" broccoli-funnel "^2.0.1" broccoli-source "^1.1.0" clone "^2.1.2" ember-cli-babel-plugin-helpers "^1.1.0" - ember-cli-version-checker "^2.1.2" + ember-cli-version-checker "^4.1.0" ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + rimraf "^3.0.1" semver "^5.5.0" ember-cli-chart@3.7.2: @@ -7201,14 +7863,14 @@ ember-in-viewport@~3.7.2: intersection-observer-admin "~0.2.12" raf-pool "~0.1.4" -ember-infinity@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ember-infinity/-/ember-infinity-2.1.2.tgz#74eb09554d7e500979b7fe24a4843ecca5baf435" - integrity sha512-SgNGGyMp0oWWObcVpK1K9ztcz7bjXeR0wRMo38hgJlk5Vuj4jb4JdeV4500YCFGuQzTgAR9y5xSJ3v/q1IxXAg== +ember-infinity@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-infinity/-/ember-infinity-2.2.0.tgz#e2ef5724e7b7d33ae3a311be16ed3cc7ced3826a" + integrity sha512-pkaWUfLBAFztiyTK+xfDBEw3l6n403v0ArA3x0BEMLHmMv/y879X5rX9/RPDif1SrT+itcsnKBbV9tagVTfv7w== dependencies: "@ember/render-modifiers" "^1.0.2" - ember-cli-babel "~7.11.0" - ember-cli-htmlbars "^3.0.1" + ember-cli-babel "~7.19.0" + ember-cli-htmlbars "^4.3.1" ember-in-viewport "~3.7.2" "ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0": @@ -11844,7 +12506,7 @@ node-releases@^1.1.69: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== -node-releases@^1.1.70: +node-releases@^1.1.70, node-releases@^1.1.71: version "1.1.71" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== From c20885cb7195e3ca3d5ee89d03f9d9b46a310050 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Wed, 12 May 2021 17:20:13 +0530 Subject: [PATCH 0272/3032] Fixed checkbox state not persisted in wizard closes https://github.com/TryGhost/Team/issues/676 The checkbox state for portal plans was not stored between wizard pages and kept switching back to original state. --- app/components/gh-launch-wizard/finalise.js | 4 +- .../gh-launch-wizard/set-pricing.hbs | 2 +- .../gh-launch-wizard/set-pricing.js | 42 ++++++++++++++++--- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/app/components/gh-launch-wizard/finalise.js b/app/components/gh-launch-wizard/finalise.js index 1c9fc6b8ec..2898713bef 100644 --- a/app/components/gh-launch-wizard/finalise.js +++ b/app/components/gh-launch-wizard/finalise.js @@ -23,11 +23,11 @@ export default class GhLaunchWizardFinaliseComponent extends Component { const yearlyPrice = updatedProduct.get('stripePrices').find(d => d.nickname === 'Yearly'); const portalPlans = this.settings.get('portalPlans') || []; let allowedPlans = [...portalPlans]; - if (data.isMonthlyChecked && monthlyPrice) { + if (data.isMonthlyChecked && monthlyPrice && !allowedPlans.includes(monthlyPrice.id)) { allowedPlans.push(monthlyPrice.id); } - if (data.isYearlyChecked && yearlyPrice) { + if (data.isYearlyChecked && yearlyPrice && !allowedPlans.includes(yearlyPrice.id)) { allowedPlans.push(yearlyPrice.id); } this.settings.set('portalPlans', allowedPlans); diff --git a/app/components/gh-launch-wizard/set-pricing.hbs b/app/components/gh-launch-wizard/set-pricing.hbs index a8edccac57..85df67f6ec 100644 --- a/app/components/gh-launch-wizard/set-pricing.hbs +++ b/app/components/gh-launch-wizard/set-pricing.hbs @@ -127,7 +127,7 @@ {{/if}}
    - + {{!-- TODO: reset "failed" state automatically --}} Date: Wed, 12 May 2021 15:47:37 +0100 Subject: [PATCH 0273/3032] Lock file maintenance with fixes no issue - catch `undefined` error when saving posts in editor which is thrown by our validation system and handled elsewhere - bumped `ember-power-select` and switched `ember-power-datepicker` to a github ref so dependency-update fixes are included (version not released yet, see https://github.com/cibernox/ember-power-datepicker/issues/61) - added a resolution for `ember-basic-dropdown@3.0.16`, with the latest `3.0.17` nothing is shown for the publish/post-settings menus for the date picker dropdown --- app/components/gh-date-time-picker.hbs | 2 +- app/controllers/editor.js | 5 + package.json | 7 +- yarn.lock | 2676 ++++++------------------ 4 files changed, 649 insertions(+), 2041 deletions(-) diff --git a/app/components/gh-date-time-picker.hbs b/app/components/gh-date-time-picker.hbs index bae379e2f4..3137510f76 100644 --- a/app/components/gh-date-time-picker.hbs +++ b/app/components/gh-date-time-picker.hbs @@ -6,7 +6,7 @@ @renderInPlace={{true}} @disabled={{this.disabled}} as |dp| > - +
    =1.0.0 <3", "ember-concurrency@^0.8.27 || ^0.9.0 || ^0.10.0 || ^1.0.0 || ^2.0.0-rc.1": version "2.0.3" resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-2.0.3.tgz#d8ac917fdf013a277bfc7b26e417937ee0638455" integrity sha512-+fOOFt32odnunDL3Du0LqMgnRzDDNKnzo1ry9ppICpvLXekJzYFwU1RniVivfJ+9nbpHMJZQUlZJAm1ZAnTExw== @@ -7663,7 +6341,7 @@ ember-concurrency@2.0.3: ember-compatibility-helpers "^1.2.0" ember-destroyable-polyfill "^2.0.2" -"ember-concurrency@>=1.0.0 <3", "ember-concurrency@^0.8.27 || ^0.9.0 || ^0.10.0 || ^1.0.0 || ^1.1.0", ember-concurrency@^1.0.0: +ember-concurrency@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.3.0.tgz#66f90fb792687470bcee1172adc0ebf33f5e8b9c" integrity sha512-DwGlfWFpYyAkTwsedlEtK4t1DznJSculAW6Vq5S1C0shVPc5b6tTpHB2FFYisannSYkm+wpm1f1Pd40qiNPtOQ== @@ -7715,9 +6393,9 @@ ember-decorators@6.1.1, ember-decorators@^6.1.1: ember-cli-babel "^7.7.3" ember-destroyable-polyfill@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.2.tgz#2cc7532bd3c00e351b4da9b7fc683f4daff79671" - integrity sha512-9t+ya+9c+FkNM5IAyJIv6ETG8jfZQaUnFCO5SeLlV0wkSw7TOexyb61jh5GVee0KmknfRhrRGGAyT4Y0TwkZ+w== + version "2.0.3" + resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.3.tgz#1673ed66609a82268ef270a7d917ebd3647f11e1" + integrity sha512-TovtNqCumzyAiW0/OisSkkVK93xnVF4NRU6+FN0ubpfwEOpRrmM2RqDwXI6YAChCgSHON1cz0DfQStpA1Gjuuw== dependencies: ember-cli-babel "^7.22.1" ember-cli-version-checker "^5.1.1" @@ -7730,13 +6408,6 @@ ember-drag-drop@0.4.8: dependencies: ember-cli-babel "^6.6.0" -ember-element-helper@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ember-element-helper/-/ember-element-helper-0.2.0.tgz#eacdf4d8507d6708812623206e24ad37bad487e7" - integrity sha512-/WV0PNLyxDvLX/YETb/8KICFTr719OYqFWXqV5XUkh9YhhBGDU/mr1OtlQaWOlsx+sHm42HD2UAICecqex8ziw== - dependencies: - ember-cli-babel "^6.16.0" - ember-element-helper@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/ember-element-helper/-/ember-element-helper-0.3.2.tgz#a0e384c266c6fb0e39803708d6f5e83ce6dba659" @@ -7819,16 +6490,6 @@ ember-get-config@, "ember-get-config@^0.2.4 || ^0.3.0": ember-cli-version-checker "^2.1.0" ember-factory-for-polyfill "^1.3.1" -ember-in-element-polyfill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-in-element-polyfill/-/ember-in-element-polyfill-1.0.0.tgz#10365af6fe31bc59e71ec463ed209d4ba4caecda" - integrity sha512-0eSfWWgkOMvj7lcjo20VX8uX4HYxSOxm6MY3bAzqW5RpnHcpcrRf6o4y80xLGh5pp9z8FobiUfFwubphACP8mQ== - dependencies: - debug "^4.1.1" - ember-cli-babel "^7.19.0" - ember-cli-htmlbars "^4.3.1" - ember-cli-version-checker "^5.0.2" - ember-in-element-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ember-in-element-polyfill/-/ember-in-element-polyfill-1.0.1.tgz#143504445bb4301656a2eaad42644d684f5164dd" @@ -7934,14 +6595,14 @@ ember-maybe-import-regenerator@^0.1.6: regenerator-runtime "^0.9.5" ember-maybe-in-element@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-2.0.1.tgz#fa3a26cc2c522a27129d6528b400b9c820943be6" - integrity sha512-Mp/HTVOGu9H7kWoq5xncVLEvPFgRuHdsqWyZ1v/gBA8Y3d2q2LdrmDK9Zg59i+cCs4oa9LrMeFyKMAbBS3vyDw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-2.0.2.tgz#93e503fb0655b65cc822e4040e51e13814b5f648" + integrity sha512-NyZNEGsdUHKUbpeZV0U6fbs0KaRKaa6O6E3RP3TMoqUA/NI3Fhha28kZ38aPe21KMgN4I1NHicgSHf4ijuHFsA== dependencies: ember-cli-babel "^7.21.0" ember-cli-htmlbars "^5.2.0" ember-cli-version-checker "^5.1.1" - ember-in-element-polyfill "^1.0.0" + ember-in-element-polyfill "^1.0.1" ember-mocha@0.16.2: version "0.16.2" @@ -8015,40 +6676,39 @@ ember-power-calendar-moment@0.1.7: ember-cli-babel "^7.7.3" ember-cli-moment-shim "^3.7.1" -ember-power-calendar@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/ember-power-calendar/-/ember-power-calendar-0.15.0.tgz#428318ad04fdd552245cf851b1ff89a207971dd5" - integrity sha512-530uXI1nVYs3GJGjqblQuY0s0/Ucp8w4aY3h+jX2ZEyuo/ym1xsEFB+r+OkWZ/LLzfWtRibmeG8ABvB0gXukvw== +ember-power-calendar@^0.16.3: + version "0.16.4" + resolved "https://registry.yarnpkg.com/ember-power-calendar/-/ember-power-calendar-0.16.4.tgz#3aa7e4ed1ba4843e6abeeaaad07a41d21ec7ab3a" + integrity sha512-zNP9dojTRbBbNVmoag3kc+MZlzJDsNlfeYJ8pU8mqeKJnYSJFO6jdN1XW/H/dqQngCRXOXGYZHHbFzGcyFsdKA== dependencies: - ember-assign-helper "^0.2.0" + ember-assign-helper "^0.3.0" ember-cli-babel "^7.18.0" - ember-cli-element-closest-polyfill "^0.0.1" + ember-cli-element-closest-polyfill "^0.0.2" ember-cli-htmlbars "^4.2.3" - ember-concurrency "^0.8.27 || ^0.9.0 || ^0.10.0 || ^1.0.0 || ^1.1.0" + ember-concurrency "^0.8.27 || ^0.9.0 || ^0.10.0 || ^1.0.0 || ^2.0.0-rc.1" ember-decorators "^6.1.1" - ember-element-helper "^0.2.0" - ember-truth-helpers "^2.1.0" + ember-element-helper "^0.3.2" + ember-truth-helpers "^2.1.0 || ^3.0.0" -ember-power-datepicker@0.8.1: +ember-power-datepicker@cibernox/ember-power-datepicker: version "0.8.1" - resolved "https://registry.yarnpkg.com/ember-power-datepicker/-/ember-power-datepicker-0.8.1.tgz#add31b521890b47d57fd243d5337be9073be2b25" - integrity sha512-Y1+PYfCPooVzjRkBfZ/QQH0aE5hpV3rS2Cyj13mzoZ+pFuyQEigvI2C4H5//ckSk2Kc9Uj+d+0lzq7P+Ymf3Tw== + resolved "https://codeload.github.com/cibernox/ember-power-datepicker/tar.gz/da580474a2c449b715444934ddb626b7c07f46a7" dependencies: - ember-basic-dropdown "^3.0.1" - ember-cli-babel "^7.18.0" - ember-cli-htmlbars "^4.2.3" + ember-basic-dropdown "^3.0.11" + ember-cli-babel "^7.22.1" + ember-cli-htmlbars "^5.3.1" ember-decorators "^6.1.1" - ember-power-calendar "^0.15.0" + ember-power-calendar "^0.16.3" -ember-power-select@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-4.1.4.tgz#bf293f9190b115c6367d01ac6ae8a2ab19cb1385" - integrity sha512-YZmjtX8ASLaO4Udl8y1A7xKEj7oB+/kmKPlwWyu6935Y1QoAcYeOrZQg+1kFNnWfhLyqAD6zUukmfTPYb2AGhg== +ember-power-select@4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-4.1.5.tgz#8bf4b77a5577972ac7793d7ac81580f79154d122" + integrity sha512-J/WJau0fXBl6VGocctUKElK2vJYMzUfk2AqD61ezGVLF65aobo8G4BJuQoIZJr6dl2++fuNWHjO5iz8dHEAVPQ== dependencies: "@glimmer/component" "^1.0.2" "@glimmer/tracking" "^1.0.2" ember-assign-helper "^0.3.0" - ember-basic-dropdown "^3.0.16" + ember-basic-dropdown "^3.0.17" ember-cli-babel "^7.23.0" ember-cli-htmlbars "^5.3.1" ember-cli-typescript "^4.1.0" @@ -8076,12 +6736,7 @@ ember-resolver@8.0.2: ember-cli-version-checker "^5.1.1" resolve "^1.17.0" -ember-rfc176-data@^0.3.1, ember-rfc176-data@^0.3.13, ember-rfc176-data@^0.3.15, ember-rfc176-data@^0.3.16: - version "0.3.16" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.16.tgz#2ace0ac9cf9016d493a74a1d931643a308679803" - integrity sha512-IYAzffS90r2ybAcx8c2qprYfkxa70G+/UPkxMN1hw55DU5S2aLOX6v3umKDZItoRhrvZMCnzwsdfKSrKdC9Wbg== - -ember-rfc176-data@^0.3.17: +ember-rfc176-data@^0.3.1, ember-rfc176-data@^0.3.13, ember-rfc176-data@^0.3.15, ember-rfc176-data@^0.3.17: version "0.3.17" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.17.tgz#d4fc6c33abd6ef7b3440c107a28e04417b49860a" integrity sha512-EVzTTKqxv9FZbEh6Ktw56YyWRAA0MijKvl7H8C06wVF+8f/cRRz3dXxa4nkwjzyVwx4rzKGuIGq77hxJAQhWWw== @@ -8242,13 +6897,6 @@ ember-truth-helpers@3.0.0, "ember-truth-helpers@^2.1.0 || ^3.0.0": dependencies: ember-cli-babel "^7.22.1" -ember-truth-helpers@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" - integrity sha512-BQlU8aTNl1XHKTYZ243r66yqtR9JU7XKWQcmMA+vkqfkE/c9WWQ9hQZM8YABihCmbyxzzZsngvldokmeX5GhAw== - dependencies: - ember-cli-babel "^6.6.0" - ember-useragent@0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/ember-useragent/-/ember-useragent-0.10.0.tgz#63a5094b19a7710153895d1813bc817524200825" @@ -8296,9 +6944,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: once "^1.4.0" engine.io-client@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.0.tgz#fc1b4d9616288ce4f2daf06dcf612413dec941c7" - integrity sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA== + version "3.5.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.2.tgz#0ef473621294004e9ceebe73cef0af9e36f2f5fa" + integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA== dependencies: component-emitter "~1.3.0" component-inherit "0.0.3" @@ -8309,7 +6957,7 @@ engine.io-client@~3.5.0: parseqs "0.0.6" parseuri "0.0.6" ws "~7.4.2" - xmlhttprequest-ssl "~1.5.4" + xmlhttprequest-ssl "~1.6.2" yeast "0.1.2" engine.io-parser@~2.2.0: @@ -8361,16 +7009,21 @@ entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -entities@^2.0.0, entities@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@~2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + errlop@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" @@ -8386,55 +7039,18 @@ errno@^0.1.3, errno@~0.1.7: error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" - integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== - dependencies: - string-template "~0.2.1" - -es-abstract@^1.17.2: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.1: - version "1.18.0-next.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" - integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.1" - is-regex "^1.1.1" - object-inspect "^1.9.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.3" - string.prototype.trimstart "^1.0.3" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== + dependencies: + string-template "~0.2.1" -es-abstract@^1.18.0-next.2: +es-abstract@^1.17.2, es-abstract@^1.18.0-next.2: version "1.18.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== @@ -8490,7 +7106,7 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^1.11.0, escodegen@^1.14.1: +escodegen@^1.11.0: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -8502,6 +7118,18 @@ escodegen@^1.11.0, escodegen@^1.14.1: optionalDependencies: source-map "~0.6.1" +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-plugin-ember@9.3.0: version "9.3.0" resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-9.3.0.tgz#77ec28a0c586ea55bbd30d140c784afcdf59e97b" @@ -8625,9 +7253,9 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3 integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@7.26.0: version "7.26.0" @@ -8799,14 +7427,7 @@ esprima@~3.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" integrity sha1-U88kes2ncxPlUcOqLnM0LT+099k= -esquery@^1.0.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - -esquery@^1.3.1, esquery@^1.4.0: +esquery@^1.0.1, esquery@^1.3.1, esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== @@ -8861,9 +7482,9 @@ events-to-array@^1.0.1: integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= events@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -8874,9 +7495,9 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^1.0.0: version "1.0.0" @@ -9057,9 +7678,9 @@ extsprintf@^1.2.0: integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fake-xml-http-request@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz#279fdac235840d7a4dff77d98ec44bce9fc690a6" - integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== + version "2.1.2" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.2.tgz#f1786720cae50bbb46273035a0173414f3e85e74" + integrity sha512-HaFMBi7r+oEC9iJNpc3bvcW7Z7iLmM26hPDmlb0mFwyANSsOQAtJxbdWsXITKOzZUyMYK0zYCv3h5yDj9TsiXg== faker@5.5.3: version "5.5.3" @@ -9142,9 +7763,9 @@ fastboot-transform@^0.1.2, fastboot-transform@^0.1.3: convert-source-map "^1.5.1" fastq@^1.6.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" - integrity sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== dependencies: reusify "^1.0.4" @@ -9206,9 +7827,9 @@ filesize@^4.1.2: integrity sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA== filesize@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" - integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.3.0.tgz#dff53cfb3f104c9e422f346d53be8dbcc971bf11" + integrity sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g== fill-range@^4.0.0: version "4.0.0" @@ -9366,9 +7987,9 @@ fixturify-project@^1.10.0: tmp "^0.0.33" fixturify-project@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-2.1.0.tgz#1677be3f116ec3f6b2b2ebb75b393d5860c4668e" - integrity sha512-B59wD4I5HDbokvmZatZTyNIjuSBjZzcZoEYdr9kdG9qRc/FSDjzUzzvHbrZL7oWfu9qsbyJBjzf0R0WC5hIZsA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-2.1.1.tgz#a511dd26700c6b64ac271ef4393e7124f153c81f" + integrity sha512-sP0gGMTr4iQ8Kdq5Ez0CVJOZOGWqzP5dv/veOTdFNywioKjkNWCHBi1q65DMpcNGUGeoOUWehyji274Q2wRgxA== dependencies: fixturify "^2.1.0" tmp "^0.0.33" @@ -9386,9 +8007,9 @@ fixturify@^1.2.0: matcher-collection "^2.0.0" fixturify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-2.1.0.tgz#a0437faac9b6e4aeb35910a1214df866aeec5d75" - integrity sha512-gHq6UCv8DE91EpiaRSzrmvLoRvFOBzI961IQ3gXE5wfmMM1TtApDcZAonG2hnp6GJrVFCxHwP01wSw9VQJiJ1w== + version "2.1.1" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-2.1.1.tgz#e962d72f062600cb81a9651086f60d822c72d998" + integrity sha512-SRgwIMXlxkb6AUgaVjIX+jCEqdhyXu9hah7mcK+lWynjKtX73Ux1TDv71B7XyaQ+LJxkYRHl5yCL8IycAvQRUw== dependencies: "@types/fs-extra" "^8.1.0" "@types/minimatch" "^3.0.3" @@ -9425,9 +8046,9 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" - integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== flatten@^1.0.2: version "1.0.3" @@ -9443,9 +8064,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" - integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -9562,29 +8183,17 @@ fs-extra@^8.0.0, fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== +fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-merger@^3.0.1, fs-merger@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.1.0.tgz#f30f74f6c70b2ff7333ec074f3d2f22298152f3b" - integrity sha512-RZ9JtqugaE8Rkt7idO5NSwcxEGSDZpLmVFjtVQUm3f+bWun7JAU6fKyU6ZJUeUnKdJwGx8uaro+K4QQfOR7vpA== - dependencies: - broccoli-node-api "^1.7.0" - broccoli-node-info "^2.1.0" - fs-extra "^8.0.1" - fs-tree-diff "^2.0.1" - rimraf "^2.6.3" - walk-sync "^2.0.2" + universalify "^2.0.0" -fs-merger@^3.2.1: +fs-merger@^3.0.1, fs-merger@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" integrity sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug== @@ -9651,9 +8260,9 @@ fsevents@^1.2.7: nan "^2.12.1" fsevents@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" - integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -9679,7 +8288,7 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -9694,16 +8303,7 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-intrinsic@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" - integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -9772,9 +8372,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" @@ -9786,7 +8386,7 @@ glob@3.2.11: inherits "2" minimatch "0.3" -glob@7.1.7: +glob@7.1.7, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -9809,18 +8409,6 @@ glob@^5.0.10, glob@~5.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.4, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -9914,9 +8502,9 @@ got@^8.0.1: url-to-options "^1.0.1" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -10011,9 +8599,9 @@ grunt@1.4.0: rimraf "~3.0.2" handlebars@^4.0.13, handlebars@^4.0.4, handlebars@^4.3.1, handlebars@^4.4.2, handlebars@^4.7.3: - version "4.7.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" - integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" neo-async "^2.6.0" @@ -10081,12 +8669,7 @@ has-symbol-support-x@^1.4.1: resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-symbols@^1.0.2: +has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== @@ -10210,7 +8793,7 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -10244,10 +8827,10 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^3.0.6: - version "3.0.7" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" - integrity sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ== +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== dependencies: lru-cache "^6.0.0" @@ -10261,11 +8844,6 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -10445,11 +9023,16 @@ inflected@^2.0.4: resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.1.0.tgz#2816ac17a570bbbc8303ca05bca8bf9b3f959687" integrity sha512-hAEKNxvHf2Iq3H60oMBHkB4wl5jn3TPF3+fXek/sRwAB5gP9xWs4r7aweSF95f99HFoz69pnZTcu8f0SIHV18w== -inflection@1.12.0, inflection@^1.12.0: +inflection@1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= +inflection@^1.12.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" + integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -10561,11 +9144,6 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -10609,9 +9187,9 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== is-binary-path@^1.0.0: version "1.0.1" @@ -10628,11 +9206,11 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" is-buffer@^1.1.5: version "1.1.6" @@ -10646,12 +9224,7 @@ is-builtin-module@^3.1.0: dependencies: builtin-modules "^3.0.0" -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== - -is-callable@^1.2.3: +is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== @@ -10668,10 +9241,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.1.0, is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" @@ -10690,9 +9263,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== is-descriptor@^0.1.0: version "0.1.6" @@ -10717,6 +9290,11 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -10786,9 +9364,9 @@ is-negative-zero@^2.0.1: integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-number-object@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== is-number@^3.0.0: version "3.0.0" @@ -10830,9 +9408,9 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: isobject "^3.0.1" is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-reference@^1.1.0: version "1.2.1" @@ -10841,20 +9419,13 @@ is-reference@^1.1.0: dependencies: "@types/estree" "*" -is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - is-regex@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== dependencies: call-bind "^1.0.2" - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-relative@^1.0.0: version "1.0.0" @@ -10884,23 +9455,16 @@ is-stream@^2.0.0: integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-type@0.0.1: version "0.0.1" @@ -10936,6 +9500,13 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -10952,9 +9523,9 @@ isarray@2.0.1: integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= isbinaryfile@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" - integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== isexe@^2.0.0: version "2.0.0" @@ -11018,9 +9589,9 @@ jquery-deferred@^0.3.0: integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= jquery@^3.4.1, jquery@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" - integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== + version "3.6.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" + integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== js-string-escape@^1.0.1: version "1.0.1" @@ -11082,35 +9653,35 @@ jsdom@^12.0.0: xml-name-validator "^3.0.0" jsdom@^16.4.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" - integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + version "16.5.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136" + integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== dependencies: - abab "^2.0.3" - acorn "^7.1.1" + abab "^2.0.5" + acorn "^8.1.0" acorn-globals "^6.0.0" cssom "^0.4.4" - cssstyle "^2.2.0" + cssstyle "^2.3.0" data-urls "^2.0.0" - decimal.js "^10.2.0" + decimal.js "^10.2.1" domexception "^2.0.1" - escodegen "^1.14.1" + escodegen "^2.0.0" html-encoding-sniffer "^2.0.1" is-potential-custom-element-name "^1.0.0" nwsapi "^2.2.0" - parse5 "5.1.1" + parse5 "6.0.1" request "^2.88.2" - request-promise-native "^1.0.8" - saxes "^5.0.0" + request-promise-native "^1.0.9" + saxes "^5.0.1" symbol-tree "^3.2.4" - tough-cookie "^3.0.1" + tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" w3c-xmlserializer "^2.0.0" webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - ws "^7.2.3" + whatwg-url "^8.5.0" + ws "^7.4.4" xml-name-validator "^3.0.0" jsesc@^1.3.0: @@ -11193,9 +9764,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -11238,9 +9809,9 @@ jsprim@^1.2.2: verror "1.10.0" just-extend@^4.0.2: - version "4.1.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.1.tgz#158f1fdb01f128c411dc8b286a7b4837b3545282" - integrity sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== "keymaster@https://github.com/madrobby/keymaster.git": version "1.6.3" @@ -11420,9 +9991,9 @@ locate-path@^5.0.0: p-locate "^4.1.0" lodash-es@^4.17.11: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.20.tgz#29f6332eefc60e849f869c264bc71126ad61e8f7" - integrity sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash._baseassign@^3.0.0: version "3.2.0" @@ -11717,6 +10288,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.uniq@^4.2.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -11732,12 +10308,7 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.11.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.5.1, lodash@~4.17.19: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -lodash@^4.17.21, lodash@~4.17.21: +lodash@^4.11.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.5.1, lodash@^4.7.0, lodash@~4.17.19, lodash@~4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -12075,12 +10646,12 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: to-regex "^3.0.2" micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" - picomatch "^2.0.5" + picomatch "^2.2.3" miller-rabin@^4.0.0: version "4.0.1" @@ -12090,17 +10661,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.45.0, "mime-db@>= 1.43.0 < 2": - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.26, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.45.0" + mime-db "1.47.0" mime@1.6.0: version "1.6.0" @@ -12127,7 +10698,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= @@ -12292,9 +10863,9 @@ mocha@^2.5.3: to-iso-string "0.0.2" moment-timezone@^0.5.13: - version "0.5.32" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.32.tgz#db7677cc3cc680fd30303ebd90b0da1ca0dfecc2" - integrity sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA== + version "0.5.33" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" + integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w== dependencies: moment ">= 2.9.0" @@ -12428,9 +10999,9 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== nise@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" - integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== + version "4.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" + integrity sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/fake-timers" "^6.0.0" @@ -12491,9 +11062,9 @@ node-modules-path@^1.0.0, node-modules-path@^1.0.1: integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== node-notifier@^5.0.1: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + version "5.4.5" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" + integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ== dependencies: growly "^1.3.0" is-wsl "^1.1.0" @@ -12501,12 +11072,19 @@ node-notifier@^5.0.1: shellwords "^0.1.1" which "^1.3.0" -node-releases@^1.1.69: - version "1.1.70" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" - integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== +node-notifier@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-9.0.1.tgz#cea837f4c5e733936c7b9005e6545cea825d1af4" + integrity sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" -node-releases@^1.1.70, node-releases@^1.1.71: +node-releases@^1.1.71: version "1.1.71" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== @@ -12578,12 +11156,12 @@ npm-git-info@^1.0.3: integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= npm-package-arg@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.0.tgz#b5f6319418c3246a1c38e1a8fbaa06231bc5308f" - integrity sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig== + version "8.1.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.2.tgz#b868016ae7de5619e729993fbd8d11dc3c52ab62" + integrity sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA== dependencies: - hosted-git-info "^3.0.6" - semver "^7.0.0" + hosted-git-info "^4.0.1" + semver "^7.3.4" validate-npm-package-name "^3.0.0" npm-run-path@^2.0.0: @@ -12663,10 +11241,10 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.8.0, object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== +object-inspect@^1.9.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -12680,7 +11258,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: +object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -12701,13 +11279,13 @@ object.defaults@^1.1.0: isobject "^3.0.0" object.getownpropertydescriptors@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" - integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + es-abstract "^1.18.0-next.2" object.map@^1.0.1: version "1.0.1" @@ -12725,13 +11303,13 @@ object.pick@^1.2.0, object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" on-finished@~2.3.0: @@ -12987,10 +11565,10 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== -parse5@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parseqs@0.0.6: version "0.0.6" @@ -13097,9 +11675,9 @@ pathval@^1.1.1: integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -13119,10 +11697,10 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" + integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== pify@^2.3.0: version "2.3.0" @@ -13480,21 +12058,18 @@ postcss-selector-parser@^3.0.0: uniq "^1.0.1" postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== dependencies: - is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" @@ -13580,6 +12155,11 @@ printf@^0.5.1: resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.3.tgz#8b7eec278d886833312238b2bf42b2b6f250880a" integrity sha512-t3lYN6vPU5PZXDiEZZqoyXvN8wCsBfi8gPoxTKo2e5hhV673t/KUh+mfO8P8lCOCDC/BWcOGIxKyebxc5FuqLA== +printf@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/printf/-/printf-0.6.1.tgz#b9afa3d3b55b7f2e8b1715272479fc756ed88650" + integrity sha512-is0ctgGdPJ5951KulgfzvHGwJtZ5ck8l042vRkV6jrkpBzTmb/lueTqguWHy2JfVA+RY6gFVlaZgUS0j7S/dsw== + private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -13642,7 +12222,7 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -psl@^1.1.28: +psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -13710,9 +12290,11 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.2.0, qs@^6.4.0: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" qs@~6.5.2: version "6.5.2" @@ -13738,6 +12320,11 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" @@ -14016,9 +12603,9 @@ regjsparser@^0.1.4: jsesc "~0.5.0" regjsparser@^0.6.4: - version "0.6.6" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.6.tgz#6d8c939d1a654f78859b08ddcc4aa777f3fa800a" - integrity sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ== + version "0.6.9" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== dependencies: jsesc "~0.5.0" @@ -14028,9 +12615,9 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" @@ -14051,7 +12638,7 @@ request-promise-core@1.1.4: dependencies: lodash "^4.17.19" -request-promise-native@^1.0.5, request-promise-native@^1.0.8: +request-promise-native@^1.0.5, request-promise-native@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== @@ -14171,15 +12758,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - -resolve@^1.10.1, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.9.0: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -14318,9 +12897,11 @@ run-async@^2.2.0, run-async@^2.4.0: integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" - integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -14330,9 +12911,9 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.4.0, rxjs@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" @@ -14397,7 +12978,7 @@ saxes@^3.1.3: dependencies: xmlchars "^2.1.1" -saxes@^5.0.0: +saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== @@ -14437,14 +13018,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.0.0, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.5: +semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -14581,9 +13155,9 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1 debug "^2.2.0" simple-html-tokenizer@^0.5.8: - version "0.5.10" - resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.10.tgz#0843e4f00c9677f1c81e3dfeefcee0a4aca8e5d0" - integrity sha512-1DHMUmvUOGuUZ9/+cX/+hOhWhRD5dEw6lodn8WuV+T+cQ31hhBcCu1dcDsNotowi4mMaNhrLyKoS+DtB81HdDA== + version "0.5.11" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9" + integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og== simple-swizzle@^0.2.2: version "0.2.2" @@ -14597,13 +13171,13 @@ simple-swizzle@^0.2.2: resolved "https://github.com/kevinansfield/simplemde-markdown-editor.git#4c39702de7d97f9b32d5c101f39237b6dab7c3ee" sinon@^9.0.0: - version "9.2.3" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.3.tgz#f68ce414e843e2fd638703043c97f260697caa52" - integrity sha512-m+DyAWvqVHZtjnjX/nuShasykFeiZ+nPuEfD4G3gpvKGkXRhkF/6NSt2qN2FjZhfrcHXFzUzI+NLnk+42fnLEw== + version "9.2.4" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.4.tgz#e55af4d3b174a4443a8762fa8421c2976683752b" + integrity sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg== dependencies: "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" - "@sinonjs/samsam" "^5.3.0" + "@sinonjs/samsam" "^5.3.1" diff "^4.0.2" nise "^4.0.4" supports-color "^7.1.0" @@ -14739,9 +13313,9 @@ sort-object-keys@^1.1.3: integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== sort-package-json@^1.44.0: - version "1.48.1" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.48.1.tgz#58629823da53a3ccccc049cb7e7300bc23072b33" - integrity sha512-YvDm1iBzhphfXtctTS0XIBlIW/2N1DZNHx3YMcZnptpZhchqH4zazUOuEWmjfNXndwamITMt9hFPliqwx1SHvQ== + version "1.50.0" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.50.0.tgz#19fc109fe23bd157bd03c8e572fa3251a52467d8" + integrity sha512-qZpqhMU9XTntebgAgc4hv/D6Fzhh7kFnwvV6a7+q8y8J5JoaDqPYQnvXPf7BBqG95tdE8X6JVNo7/jDzcbdfUg== dependencies: detect-indent "^6.0.0" detect-newline "3.1.0" @@ -14787,9 +13361,9 @@ source-map-url@^0.3.0: integrity sha1-fsrxO1e80J2opAxdJp2zN5nUqvk= source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@0.4.x, source-map@^0.4.2: version "0.4.4" @@ -14899,9 +13473,9 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" @@ -15009,9 +13583,9 @@ string-width@^3.0.0: strip-ansi "^5.1.0" string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" @@ -15030,14 +13604,6 @@ string.prototype.matchall@^4.0.4: regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" -string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -15046,14 +13612,6 @@ string.prototype.trimend@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" -string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" @@ -15234,7 +13792,7 @@ symbol-tree@^3.2.2, symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0, symlink-or-copy@^1.3.0, symlink-or-copy@^1.3.1: +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0, symlink-or-copy@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz#9506dd64d8e98fa21dcbf4018d1eab23e77f71fe" integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA== @@ -15272,14 +13830,16 @@ table@^5.2.3: string-width "^3.0.0" table@^6.0.4: - version "6.0.7" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + version "6.7.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.0.tgz#26274751f0ee099c547f6cb91d3eff0d61d155b2" + integrity sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw== dependencies: - ajv "^7.0.2" - lodash "^4.17.20" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tap-parser@^7.0.0: version "7.0.0" @@ -15327,15 +13887,15 @@ terser@^4.1.2: source-map-support "~0.5.12" terser@^5.3.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" - integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== + version "5.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" + integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== dependencies: commander "^2.20.0" source-map "~0.7.2" source-map-support "~0.5.19" -testem@3.2.0, testem@^3.2.0: +testem@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/testem/-/testem-3.2.0.tgz#9924481f6a3b23e350fa77bb251c64d801c4c9a7" integrity sha512-FkFzNRCIzCxjbNSTxIQSC2tWn1Q2MTR/GTxusSw6uZA4byEQ7wc86TKutNnoCyZ5XIaD9wo4q+dmlK0GUEqFVA== @@ -15370,6 +13930,41 @@ testem@3.2.0, testem@^3.2.0: tmp "0.0.33" xmldom "^0.1.19" +testem@^3.2.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.1.tgz#9b30c96001d08e590827a96fec1adb5df81792f8" + integrity sha512-UhKbTAb8JF6xRoDXd0AL0wl+Rpmio6KN7q+Xv7O9fcuioAqOQQVCNyxkYrJaihUPRKGr/r8ZKtSGe/Gdkm3uGQ== + dependencies: + backbone "^1.1.2" + bluebird "^3.4.6" + charm "^1.0.0" + commander "^2.6.0" + compression "^1.7.4" + consolidate "^0.15.1" + execa "^1.0.0" + express "^4.10.7" + fireworm "^0.7.0" + glob "^7.0.4" + http-proxy "^1.13.1" + js-yaml "^3.2.5" + lodash.assignin "^4.1.0" + lodash.castarray "^4.4.0" + lodash.clonedeep "^4.4.1" + lodash.find "^4.5.1" + lodash.uniqby "^4.7.0" + mkdirp "^0.5.1" + mustache "^3.0.0" + node-notifier "^9.0.1" + npmlog "^4.0.0" + printf "^0.6.1" + rimraf "^2.4.4" + socket.io "^2.1.0" + spawn-args "^0.2.0" + styled_string "0.0.1" + tap-parser "^7.0.0" + tmp "0.0.33" + xmldom "^0.6.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -15547,14 +14142,14 @@ tough-cookie@^2.3.3, tough-cookie@^2.4.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.1.2" tr46@^1.0.1: version "1.0.1" @@ -15603,9 +14198,9 @@ tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== tty-browserify@0.0.0: version "0.0.0" @@ -15653,6 +14248,11 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -15684,14 +14284,14 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript-memoize@^1.0.0-alpha.3: - version "1.0.0-alpha.4" - resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.0-alpha.4.tgz#fd97ab63807c3392af5d0ac5f4754254a4fcd634" - integrity sha512-woA2UUWSvx8ugkEjPN8DMuNjukBp8NQeLmz+LRXbEsQIvhLR8LSlD+8Qxdk7NmgE8xeJabJdU8zSrO4ozijGjg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.1.tgz#0a8199aa28f6fe18517f6e9308ef7bfbe9a98d59" + integrity sha512-oJNge1qUrOK37d5Y6Ly2txKeuelYVsFtNF6U9kXIN7juudcQaHJQg2MxLOy0CqtkW65rVDYuTCOjnSIVPd8z3w== ua-parser-js@^0.7.18: - version "0.7.23" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.23.tgz#704d67f951e13195fbcd3d78818577f5bc1d547b" - integrity sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA== + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" @@ -15699,9 +14299,9 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.12.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.4.tgz#93de48bb76bb3ec0fc36563f871ba46e2ee5c7ee" - integrity sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A== + version "3.13.6" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.6.tgz#6815ac7fdd155d03c83e2362bb717e5b39b74013" + integrity sha512-rRprLwl8RVaS+Qvx3Wh5hPfPBn9++G6xkGlUupya0s5aDmNjI7z3lnRLB3u7sN4OmbB0pWgzhM9BEJyiWAwtAA== unbox-primitive@^1.0.0: version "1.0.1" @@ -15727,9 +14327,9 @@ underscore.string@^3.2.2, underscore.string@~3.3.4, underscore.string@~3.3.5: util-deprecate "^1.0.2" underscore@>=1.8.3: - version "1.12.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.0.tgz#4814940551fc80587cef7840d1ebb0f16453be97" - integrity sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ== + version "1.13.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -15800,16 +14400,11 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -universalify@^0.1.0: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -15937,9 +14532,9 @@ uuid@^8.3.0: integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8flags@~3.2.0: version "3.2.0" @@ -16181,9 +14776,9 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: iconv-lite "0.4.24" whatwg-fetch@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" - integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" @@ -16199,12 +14794,12 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whatwg-url@^8.0.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" - integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" + integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== dependencies: - lodash.sortby "^4.7.0" + lodash "^4.7.0" tr46 "^2.0.2" webidl-conversions "^6.1.0" @@ -16226,7 +14821,7 @@ which@^1.2.14, which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" -which@^2.0.1, which@~2.0.2: +which@^2.0.1, which@^2.0.2, which@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -16279,9 +14874,9 @@ workerpool@^3.1.1: rsvp "^4.8.4" workerpool@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.4.tgz#f83ecf101b35c034cb20ed38cedd619dde9d722c" - integrity sha512-sAc9w9oAJQ2680gDArGinjw0Ygj2K3KF1ZCRfslBKUCzc9Gycwlj9ZIAbizPRBftcXxhXgoGMVPxJE0VMNnWbw== + version "6.1.4" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.4.tgz#6a972b6df82e38d50248ee2820aa98e2d0ad3090" + integrity sha512-jGWPzsUqzkow8HoAvqaPWTUPCrlPJaJ5tY8Iz7n1uCz3tTp6s3CDG0FF1NsX42WNlkRSW6Mr+CDZGnNoSsKa7g== wrap-legacy-hbs-plugin-if-needed@^1.0.1: version "1.0.1" @@ -16322,10 +14917,10 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" -ws@^7.2.3, ws@~7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" - integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== +ws@^7.4.4, ws@~7.4.2: + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== xdg-basedir@^4.0.0: version "4.0.0" @@ -16347,10 +14942,15 @@ xmldom@^0.1.19: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== -xmlhttprequest-ssl@~1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" - integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= +xmldom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.6.0.tgz#43a96ecb8beece991cef382c08397d82d4d0c46f" + integrity sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg== + +xmlhttprequest-ssl@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.2.tgz#dd6899bfbcf684b554e393c30b13b9f3b001a7ee" + integrity sha512-tYOaldF/0BLfKuoA39QMwD4j2m8lq4DIncqj1yuNELX4vz9+z/ieG/vwmctjJce+boFHXstqhWnHSxc4W8f4qg== xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" @@ -16358,9 +14958,9 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yallist@^3.0.0, yallist@^3.0.2: version "3.1.1" From fbbcb449232d28962cad82d02af40fc8d0048aaa Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 12 May 2021 15:52:17 +0100 Subject: [PATCH 0274/3032] Removed ember-testing group from Renovate config no issue - the dependencies are released at different cadences and are not interlinked - allows independent upgrades when one dependency with a slow release is buggy --- renovate.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/renovate.json b/renovate.json index 4c5f4d1797..d587df15e2 100644 --- a/renovate.json +++ b/renovate.json @@ -20,10 +20,6 @@ "groupName": "ember core", "packageNames": ["ember-source", "ember-cli", "ember-data"] }, - { - "groupName": "ember testing", - "packageNames": ["ember-mocha", "ember-exam", "testem"] - }, { "groupName": "disable css", "packagePatterns": [ From 72703de67d0deba0d5b641e4bc38fec40db30b84 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 15:56:22 +0100 Subject: [PATCH 0275/3032] Lock file maintenance (added missing uids) (#1939) Co-authored-by: Renovate Bot --- yarn.lock | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/yarn.lock b/yarn.lock index ac66e0e27f..b42f5e20ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6692,6 +6692,7 @@ ember-power-calendar@^0.16.3: ember-power-datepicker@cibernox/ember-power-datepicker: version "0.8.1" + uid da580474a2c449b715444934ddb626b7c07f46a7 resolved "https://codeload.github.com/cibernox/ember-power-datepicker/tar.gz/da580474a2c449b715444934ddb626b7c07f46a7" dependencies: ember-basic-dropdown "^3.0.11" @@ -8476,6 +8477,7 @@ gonzales-pe@4.2.4: "google-caja-bower@https://github.com/acburdine/google-caja-bower#ghost": version "6011.0.0" + uid "275cb75249f038492094a499756a73719ae071fd" resolved "https://github.com/acburdine/google-caja-bower#275cb75249f038492094a499756a73719ae071fd" got@^8.0.1: @@ -9815,6 +9817,7 @@ just-extend@^4.0.2: "keymaster@https://github.com/madrobby/keymaster.git": version "1.6.3" + uid f8f43ddafad663b505dc0908e72853bcf8daea49 resolved "https://github.com/madrobby/keymaster.git#f8f43ddafad663b505dc0908e72853bcf8daea49" keyv@3.0.0: @@ -13168,6 +13171,7 @@ simple-swizzle@^0.2.2: "simplemde@https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost": version "1.11.2" + uid "4c39702de7d97f9b32d5c101f39237b6dab7c3ee" resolved "https://github.com/kevinansfield/simplemde-markdown-editor.git#4c39702de7d97f9b32d5c101f39237b6dab7c3ee" sinon@^9.0.0: From ec59d7d373cadc795ffbe5405cd6db3880910ba7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 17:11:51 +0100 Subject: [PATCH 0276/3032] Update dependency testem to v3.4.1 (#1962) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 60 ++-------------------------------------------------- 2 files changed, 3 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index 992a331d7f..b9045e648b 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "pretender": "3.4.3", "reframe.js": "3.0.2", "simplemde": "https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost", - "testem": "3.2.0", + "testem": "3.4.1", "top-gh-contribs": "2.0.4", "validator": "7.2.0", "walk-sync": "2.2.0" diff --git a/yarn.lock b/yarn.lock index b42f5e20ca..d39e1c1760 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11064,17 +11064,6 @@ node-modules-path@^1.0.0, node-modules-path@^1.0.1: resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== -node-notifier@^5.0.1: - version "5.4.5" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" - integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ== - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" - node-notifier@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-9.0.1.tgz#cea837f4c5e733936c7b9005e6545cea825d1af4" @@ -12153,11 +12142,6 @@ pretty-ms@^3.1.0: dependencies: parse-ms "^1.0.0" -printf@^0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.3.tgz#8b7eec278d886833312238b2bf42b2b6f250880a" - integrity sha512-t3lYN6vPU5PZXDiEZZqoyXvN8wCsBfi8gPoxTKo2e5hhV673t/KUh+mfO8P8lCOCDC/BWcOGIxKyebxc5FuqLA== - printf@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/printf/-/printf-0.6.1.tgz#b9afa3d3b55b7f2e8b1715272479fc756ed88650" @@ -13899,42 +13883,7 @@ terser@^5.3.0: source-map "~0.7.2" source-map-support "~0.5.19" -testem@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-3.2.0.tgz#9924481f6a3b23e350fa77bb251c64d801c4c9a7" - integrity sha512-FkFzNRCIzCxjbNSTxIQSC2tWn1Q2MTR/GTxusSw6uZA4byEQ7wc86TKutNnoCyZ5XIaD9wo4q+dmlK0GUEqFVA== - dependencies: - backbone "^1.1.2" - bluebird "^3.4.6" - charm "^1.0.0" - commander "^2.6.0" - compression "^1.7.4" - consolidate "^0.15.1" - execa "^1.0.0" - express "^4.10.7" - fireworm "^0.7.0" - glob "^7.0.4" - http-proxy "^1.13.1" - js-yaml "^3.2.5" - lodash.assignin "^4.1.0" - lodash.castarray "^4.4.0" - lodash.clonedeep "^4.4.1" - lodash.find "^4.5.1" - lodash.uniqby "^4.7.0" - mkdirp "^0.5.1" - mustache "^3.0.0" - node-notifier "^5.0.1" - npmlog "^4.0.0" - printf "^0.5.1" - rimraf "^2.4.4" - socket.io "^2.1.0" - spawn-args "^0.2.0" - styled_string "0.0.1" - tap-parser "^7.0.0" - tmp "0.0.33" - xmldom "^0.1.19" - -testem@^3.2.0: +testem@3.4.1, testem@^3.2.0: version "3.4.1" resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.1.tgz#9b30c96001d08e590827a96fec1adb5df81792f8" integrity sha512-UhKbTAb8JF6xRoDXd0AL0wl+Rpmio6KN7q+Xv7O9fcuioAqOQQVCNyxkYrJaihUPRKGr/r8ZKtSGe/Gdkm3uGQ== @@ -14818,7 +14767,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which@^1.2.14, which@^1.2.9, which@^1.3.0: +which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -14941,11 +14890,6 @@ xmlchars@^2.1.1, xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmldom@^0.1.19: - version "0.1.31" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" - integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== - xmldom@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.6.0.tgz#43a96ecb8beece991cef382c08397d82d4d0c46f" From d9754f4c3f242a3915121f2d7a2c894bedf96823 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 13 May 2021 11:38:19 +0200 Subject: [PATCH 0277/3032] Fix "Add subscription" button dark mode UI bug --- app/styles/app-dark.css | 4 ++-- app/styles/layouts/members.css | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/styles/app-dark.css b/app/styles/app-dark.css index be4bd54caa..200f702e35 100644 --- a/app/styles/app-dark.css +++ b/app/styles/app-dark.css @@ -245,12 +245,12 @@ input:focus, background: var(--black) !important; } -.gh-btn:not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):not(.gh-btn-primary):not(.gh-btn-black) { +.gh-btn:not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):not(.gh-btn-primary):not(.gh-btn-black):not(.gh-btn-text) { background: var(--lightgrey); color: var(--black); } -.gh-btn:not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):not(.gh-btn-primary):not(.gh-btn-black):hover { +.gh-btn:not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):not(.gh-btn-primary):not(.gh-btn-black):not(.gh-btn-text):hover { background: var(--lightgrey-d1); color: var(--black); } diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index bf7ca6b6e8..a40251402c 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1624,6 +1624,7 @@ p.gh-members-import-errordetail:first-of-type { .gh-btn-addproduct svg path { fill: var(--green); + stroke: none !important; } .gh-member-product-memberdetails { From 1539dc09a76a6191e7c3d258203703329a429fb2 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 13 May 2021 11:47:14 +0200 Subject: [PATCH 0278/3032] Fixed button hover state bugs in dark mode --- app/styles/app-dark.css | 4 ++-- app/styles/patterns/buttons.css | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/styles/app-dark.css b/app/styles/app-dark.css index 200f702e35..b17e2af213 100644 --- a/app/styles/app-dark.css +++ b/app/styles/app-dark.css @@ -240,8 +240,8 @@ input:focus, color: var(--white); } -.gh-btn-black:hover, -.gh-btn-primary:hover { +.gh-btn-black:not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):hover, +.gh-btn-primary:not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):hover { background: var(--black) !important; } diff --git a/app/styles/patterns/buttons.css b/app/styles/patterns/buttons.css index 2ad2c12534..f060931a6f 100644 --- a/app/styles/patterns/buttons.css +++ b/app/styles/patterns/buttons.css @@ -102,14 +102,14 @@ fieldset[disabled] .gh-btn { } .gh-btn-blue:hover { - color: #fff; - background: color-mod(var(--blue) l(-4%)); + color: #fff !important; + background: color-mod(var(--blue) l(-4%)) !important; } /* When clicked or focused with keyboard */ .gh-btn-blue:active, .gh-btn-blue:focus { - background: color-mod(var(--blue) l(-7%)); + background: color-mod(var(--blue) l(-7%)) !important; } /* Green button @@ -124,14 +124,14 @@ fieldset[disabled] .gh-btn { } .gh-btn-green:hover { - color: #fff; - background: color-mod(var(--green) l(-4%)); + color: #fff !important; + background: color-mod(var(--green) l(-4%)) !important; } /* When clicked or focused with keyboard */ .gh-btn-green:active, .gh-btn-green:focus { - background: color-mod(var(--green) l(-7%)); + background: color-mod(var(--green) l(-7%)) !important; } From 3da929552cfdb246407c202f1c1f0b5cb7d244b3 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 13 May 2021 12:06:46 +0200 Subject: [PATCH 0279/3032] Fixed account menu positioning bug --- app/styles/layouts/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/styles/layouts/main.css b/app/styles/layouts/main.css index 80f7166dc8..ca78ca0160 100644 --- a/app/styles/layouts/main.css +++ b/app/styles/layouts/main.css @@ -109,7 +109,7 @@ } .gh-nav-menu-dropdown .dropdown-menu { - top: -406px; + top: -360px; left: -13px; margin: 10px 0 0; box-shadow: var(--box-shadow-m); From 51e76d461e3306c5bacefbfb1ac958e2f7524eb7 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 14 May 2021 14:33:18 +0100 Subject: [PATCH 0280/3032] Renamed access settings route to membership no issue Members related settings are being consolidated into a single screen. - renamed access to membership as the starting point for redesign and consolidation of other settings screens --- .../settings/{members-access.js => membership.js} | 0 app/router.js | 2 +- app/templates/settings.hbs | 8 ++++---- .../settings/{members-access.hbs => membership.hbs} | 5 ++++- 4 files changed, 9 insertions(+), 6 deletions(-) rename app/controllers/settings/{members-access.js => membership.js} (100%) rename app/templates/settings/{members-access.hbs => membership.hbs} (97%) diff --git a/app/controllers/settings/members-access.js b/app/controllers/settings/membership.js similarity index 100% rename from app/controllers/settings/members-access.js rename to app/controllers/settings/membership.js diff --git a/app/router.js b/app/router.js index 5c8d079598..8ae39b3ed2 100644 --- a/app/router.js +++ b/app/router.js @@ -48,7 +48,7 @@ Router.map(function () { this.route('settings'); this.route('settings.general', {path: '/settings/general'}); - this.route('settings.members-access', {path: '/settings/members-access'}); + this.route('settings.membership', {path: '/settings/members'}); this.route('settings.members-email', {path: '/settings/members-email'}); this.route('settings.members-payments', {path: '/settings/members-payments'}); this.route('settings.code-injection', {path: '/settings/code-injection'}); diff --git a/app/templates/settings.hbs b/app/templates/settings.hbs index f9c88794db..feb7327224 100644 --- a/app/templates/settings.hbs +++ b/app/templates/settings.hbs @@ -40,14 +40,14 @@
    Members
    - + {{svg-jar "eye"}}
    -

    Access

    -

    Configure usage and default access levels

    +

    Membership

    +

    REPLACE ME

    - + {{svg-jar "module"}}

    Products

    diff --git a/app/templates/settings/members-access.hbs b/app/templates/settings/membership.hbs similarity index 97% rename from app/templates/settings/members-access.hbs rename to app/templates/settings/membership.hbs index eff6edbf58..64c5c50c69 100644 --- a/app/templates/settings/members-access.hbs +++ b/app/templates/settings/membership.hbs @@ -3,7 +3,7 @@

    Settings {{svg-jar "arrow-right"}} - Access + Membership

    +
    +

    Access and payments

    +
    From 26eae5c83f863e935ae37587b59dcbb3662306ff Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 14 May 2021 15:01:50 +0100 Subject: [PATCH 0281/3032] Extracted individual members setting blocks into components no issue - the membership setting screen will be covering a lot of areas, having individual settings as discrete components allows for easier re-organisation and cleaner parent templates and controllers --- app/components/gh-members-email-setting.hbs | 2 +- ...ients.hbs => email-default-recipients.hbs} | 0 ...ipients.js => email-default-recipients.js} | 0 .../settings/members-default-post-access.hbs | 47 +++++++++ .../settings/members-default-post-access.js | 22 +++++ .../settings/members-subscription-access.hbs | 47 +++++++++ .../settings/members-subscription-access.js | 21 ++++ app/controllers/settings/membership.js | 30 ------ app/templates/settings/membership.hbs | 97 +------------------ 9 files changed, 140 insertions(+), 126 deletions(-) rename app/components/settings/{default-email-recipients.hbs => email-default-recipients.hbs} (100%) rename app/components/settings/{default-email-recipients.js => email-default-recipients.js} (100%) create mode 100644 app/components/settings/members-default-post-access.hbs create mode 100644 app/components/settings/members-default-post-access.js create mode 100644 app/components/settings/members-subscription-access.hbs create mode 100644 app/components/settings/members-subscription-access.js diff --git a/app/components/gh-members-email-setting.hbs b/app/components/gh-members-email-setting.hbs index 6ac10823d7..d8436ff202 100644 --- a/app/components/gh-members-email-setting.hbs +++ b/app/components/gh-members-email-setting.hbs @@ -16,7 +16,7 @@

    Email

    - diff --git a/app/components/settings/default-email-recipients.hbs b/app/components/settings/email-default-recipients.hbs similarity index 100% rename from app/components/settings/default-email-recipients.hbs rename to app/components/settings/email-default-recipients.hbs diff --git a/app/components/settings/default-email-recipients.js b/app/components/settings/email-default-recipients.js similarity index 100% rename from app/components/settings/default-email-recipients.js rename to app/components/settings/email-default-recipients.js diff --git a/app/components/settings/members-default-post-access.hbs b/app/components/settings/members-default-post-access.hbs new file mode 100644 index 0000000000..4589454cd7 --- /dev/null +++ b/app/components/settings/members-default-post-access.hbs @@ -0,0 +1,47 @@ +
    +

    +
    +

    Default post access

    +

    When a new post is created, who should have access to it?

    +
    + +

    +
    + {{#liquid-if this.postAccessOpen}} +
    +
    +
    +
    +
    Public
    +
    All site visitors to your site, no login required
    +
    +
    +
    +
    +
    +
    +
    Members only
    +
    All logged-in members
    +
    +
    +
    +
    +
    +
    Paid-members only
    +
    Only logged-in members with an active Stripe subscription
    +
    +
    +
    +
    + {{/liquid-if}} +
    +
    \ No newline at end of file diff --git a/app/components/settings/members-default-post-access.js b/app/components/settings/members-default-post-access.js new file mode 100644 index 0000000000..0d5fc0047b --- /dev/null +++ b/app/components/settings/members-default-post-access.js @@ -0,0 +1,22 @@ +import Component from '@glimmer/component'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {tracked} from '@glimmer/tracking'; + +export default class SettingsMembersDefaultPostAccess extends Component { + @service settings; + + @tracked postAccessOpen = false; + + @action + togglePostAccess() { + this.postAccessOpen = !this.postAccessOpen; + } + + @action + setDefaultContentVisibility(value) { + if (this.settings.get('membersSignupAccess') !== 'none') { + this.settings.set('defaultContentVisibility', value); + } + } +} diff --git a/app/components/settings/members-subscription-access.hbs b/app/components/settings/members-subscription-access.hbs new file mode 100644 index 0000000000..972fdd64c2 --- /dev/null +++ b/app/components/settings/members-subscription-access.hbs @@ -0,0 +1,47 @@ +
    +
    +
    +

    Subscription access

    +

    Who should be able to subscribe to your site?

    +
    + +
    +
    + {{#liquid-if this.signupAccessOpen}} +
    +
    +
    +
    +
    Anyone can sign up
    +
    All visitors will be able to subscribe and sign in
    +
    +
    + +
    +
    +
    +
    Only people I invite
    +
    People can sign in from your site but won't be able to sign up
    +
    +
    + +
    +
    +
    +
    Nobody
    +
    No one will be able to subscribe or sign in
    +
    +
    +
    + {{/liquid-if}} +
    +
    \ No newline at end of file diff --git a/app/components/settings/members-subscription-access.js b/app/components/settings/members-subscription-access.js new file mode 100644 index 0000000000..62f30a2cf2 --- /dev/null +++ b/app/components/settings/members-subscription-access.js @@ -0,0 +1,21 @@ +import Component from '@glimmer/component'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {tracked} from '@glimmer/tracking'; + +export default class SettingsMembersSubscriptionAccess extends Component { + @service settings; + + @tracked signupAccessOpen = false; + + @action + toggleSignupAccess() { + this.signupAccessOpen = !this.signupAccessOpen; + } + + @action + setSignupAccess(value) { + this.settings.set('membersSignupAccess', value); + this.settings.set('defaultContentVisibility', 'public'); + } +} diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 7f7052f36f..9023c89c79 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -7,11 +7,7 @@ import {tracked} from '@glimmer/tracking'; export default class MembersAccessController extends Controller { @service settings; - queryParams = ['signupAccessOpen', 'postAccessOpen'] - @tracked showLeaveSettingsModal = false; - @tracked signupAccessOpen = false; - @tracked postAccessOpen = false; leaveRoute(transition) { if (this.settings.get('hasDirtyAttributes')) { @@ -34,32 +30,6 @@ export default class MembersAccessController extends Controller { this.leaveSettingsTransition = null; } - @action - toggleSignupAccess() { - this.signupAccessOpen = !this.signupAccessOpen; - } - - @action - togglePostAccess() { - this.postAccessOpen = !this.postAccessOpen; - } - - @action - setDefaultContentVisibility(value) { - if (this.settings.get('membersSignupAccess') !== 'none') { - this.settings.set('defaultContentVisibility', value); - } - } - - @action - setSignupAccess(value) { - this.settings.set('membersSignupAccess', value); - if (value === 'none') { - this.settings.set('defaultContentVisibility', 'public'); - this.postAccessOpen = true; - } - } - @task({drop: true}) *saveSettingsTask() { return yield this.settings.save(); diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 64c5c50c69..20f1b1e765 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -22,101 +22,8 @@

    Access and payments

    -
    -
    -
    -

    Subscription access

    -

    Who should be able to subscribe to your site?

    -
    - -
    -
    - {{#liquid-if this.signupAccessOpen}} -
    -
    -
    -
    -
    Anyone can sign up
    -
    All visitors will be able to subscribe and sign in
    -
    -
    - -
    -
    -
    -
    Only people I invite
    -
    People can sign in from your site but won't be able to sign up
    -
    -
    - -
    -
    -
    -
    Nobody
    -
    No one will be able to subscribe or sign in
    -
    -
    -
    - {{/liquid-if}} -
    -
    - -
    -

    -
    -

    Default post access

    -

    When a new post is created, who should have access to it?

    -
    - -

    -
    - {{#liquid-if this.postAccessOpen}} -
    -
    -
    -
    -
    Public
    -
    All site visitors to your site, no login required
    -
    -
    -
    -
    -
    -
    -
    Members only
    -
    All logged-in members
    -
    -
    -
    -
    -
    -
    Paid-members only
    -
    Only logged-in members with an active Stripe subscription
    -
    -
    -
    -
    - {{/liquid-if}} -
    -
    + +
    From bc924cf97037e05b00c0f5df39c35d400dd16bf3 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 14 May 2021 15:35:07 +0100 Subject: [PATCH 0282/3032] Fixed unsaved confirmation when leaving membership settings screen refs https://github.com/TryGhost/Admin/commit/51e76d461e3306c5bacefbfb1ac958e2f7524eb7 - previous commit missed rename of access route to membership --- app/routes/settings/{members-access.js => membership.js} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename app/routes/settings/{members-access.js => membership.js} (76%) diff --git a/app/routes/settings/members-access.js b/app/routes/settings/membership.js similarity index 76% rename from app/routes/settings/members-access.js rename to app/routes/settings/membership.js index 5060a24261..7448b24b48 100644 --- a/app/routes/settings/members-access.js +++ b/app/routes/settings/membership.js @@ -1,7 +1,7 @@ import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; import {inject as service} from '@ember/service'; -export default class MembersAccessRoute extends AuthenticatedRoute { +export default class MembershipSettingsRoute extends AuthenticatedRoute { @service settings; model() { @@ -16,7 +16,7 @@ export default class MembersAccessRoute extends AuthenticatedRoute { buildRouteInfoMetadata() { return { - titleToken: 'Settings - Members' + titleToken: 'Settings - Membership' }; } } From 1aef569bdd573b05146f58a65164de981a9dda1a Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 14 May 2021 15:44:10 +0100 Subject: [PATCH 0283/3032] Switched signup and default post access settings to dropdowns no issue - provides clearer indication of current setting without having to expand anything - has more minimal UI which helps when settings screen has multiple areas --- .../settings/members-default-post-access.hbs | 56 ++++++------------- .../settings/members-default-post-access.js | 30 +++++++--- .../settings/members-subscription-access.hbs | 51 +++++------------ .../settings/members-subscription-access.js | 31 +++++++--- app/templates/settings/membership.hbs | 6 +- 5 files changed, 77 insertions(+), 97 deletions(-) diff --git a/app/components/settings/members-default-post-access.hbs b/app/components/settings/members-default-post-access.hbs index 4589454cd7..07c52be6cf 100644 --- a/app/components/settings/members-default-post-access.hbs +++ b/app/components/settings/members-default-post-access.hbs @@ -1,47 +1,23 @@ -
    -

    +
    +

    Default post access

    When a new post is created, who should have access to it?

    - -

    -
    - {{#liquid-if this.postAccessOpen}} -
    -
    -
    -
    -
    Public
    -
    All site visitors to your site, no login required
    -
    -
    -
    -
    -
    -
    -
    Members only
    -
    All logged-in members
    -
    -
    -
    -
    -
    -
    Paid-members only
    -
    Only logged-in members with an active Stripe subscription
    -
    -
    +
    + + +
    +
    + {{option.name}}
    +
    {{option.description}}
    - {{/liquid-if}} -
    +
    \ No newline at end of file diff --git a/app/components/settings/members-default-post-access.js b/app/components/settings/members-default-post-access.js index 0d5fc0047b..339939ccb7 100644 --- a/app/components/settings/members-default-post-access.js +++ b/app/components/settings/members-default-post-access.js @@ -1,22 +1,38 @@ import Component from '@glimmer/component'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; -import {tracked} from '@glimmer/tracking'; export default class SettingsMembersDefaultPostAccess extends Component { @service settings; - @tracked postAccessOpen = false; + get options() { + return [{ + name: 'Public', + description: 'All site visitors to your site, no login required', + value: 'public' + }, { + name: 'Members only', + description: 'All logged-in members', + value: 'members' + }, { + name: 'Paid-members only', + description: 'Only logged-in mmembers with an active Stripe subscription', + value: 'paid' + }]; + } - @action - togglePostAccess() { - this.postAccessOpen = !this.postAccessOpen; + get selectedOption() { + if (this.settings.get('membersSignupAccess') === 'none') { + return this.options.find(o => o.value === 'public'); + } + + return this.options.find(o => o.value === this.settings.get('defaultContentVisibility')); } @action - setDefaultContentVisibility(value) { + setDefaultContentVisibility(option) { if (this.settings.get('membersSignupAccess') !== 'none') { - this.settings.set('defaultContentVisibility', value); + this.settings.set('defaultContentVisibility', option.value); } } } diff --git a/app/components/settings/members-subscription-access.hbs b/app/components/settings/members-subscription-access.hbs index 972fdd64c2..ddce7208cb 100644 --- a/app/components/settings/members-subscription-access.hbs +++ b/app/components/settings/members-subscription-access.hbs @@ -1,47 +1,22 @@ -
    +

    Subscription access

    Who should be able to subscribe to your site?

    -
    -
    - {{#liquid-if this.signupAccessOpen}} -
    -
    -
    -
    -
    Anyone can sign up
    -
    All visitors will be able to subscribe and sign in
    -
    -
    -
    -
    -
    -
    Only people I invite
    -
    People can sign in from your site but won't be able to sign up
    -
    -
    - -
    -
    -
    -
    Nobody
    -
    No one will be able to subscribe or sign in
    -
    -
    + +
    +
    + {{option.name}}
    +
    {{option.description}}
    - {{/liquid-if}} -
    +
    +
    \ No newline at end of file diff --git a/app/components/settings/members-subscription-access.js b/app/components/settings/members-subscription-access.js index 62f30a2cf2..9141f90878 100644 --- a/app/components/settings/members-subscription-access.js +++ b/app/components/settings/members-subscription-access.js @@ -1,21 +1,36 @@ import Component from '@glimmer/component'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; -import {tracked} from '@glimmer/tracking'; export default class SettingsMembersSubscriptionAccess extends Component { @service settings; - @tracked signupAccessOpen = false; + get options() { + return [{ + name: 'Anyone can sign up', + description: 'All visitors will be able to subscribe and sign in', + value: 'all' + }, { + name: 'Only people I invite', + description: 'People can sign in from your site but won\'t be able to sign up', + value: 'invite' + }, { + name: 'Nobody', + description: 'No one will be able to subscribe or sign in', + value: 'none' + }]; + } - @action - toggleSignupAccess() { - this.signupAccessOpen = !this.signupAccessOpen; + get selectedOption() { + return this.options.find(o => o.value === this.settings.get('membersSignupAccess')); } @action - setSignupAccess(value) { - this.settings.set('membersSignupAccess', value); - this.settings.set('defaultContentVisibility', 'public'); + setSignupAccess(option) { + this.settings.set('membersSignupAccess', option.value); + + if (option.value === 'none') { + this.settings.set('defaultContentVisibility', 'public'); + } } } diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 20f1b1e765..9496777853 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -21,10 +21,8 @@

    Access and payments

    -
    - - -
    + +
    {{#if this.showLeaveSettingsModal}} From 12be86047c2ad5f41c8c0b284036b5e53920aa27 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 14 May 2021 16:01:14 +0100 Subject: [PATCH 0284/3032] =?UTF-8?q?=F0=9F=8E=A8=20Reverted=20ability=20t?= =?UTF-8?q?o=20set=20post=20access=20level=20to=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Team/issues/581 Setting post visibility to a label results in undesirable and confusing behaviour with no good way to manage access long-term. Coupled with products being limited to a single product for now we're reverting the UI back to the "Public", "Members", and "Paid" options. --- app/components/gh-post-settings-menu.hbs | 32 ++------------ app/components/gh-post-settings-menu.js | 17 -------- app/components/gh-psm-visibility-input.hbs | 10 +++++ app/components/gh-psm-visibility-input.js | 32 ++++++++++++++ app/models/post.js | 14 +----- app/transforms/visibility-string.js | 29 ------------- app/validators/post.js | 8 ---- .../gh-psm-visibility-input-test.js | 43 +++++++++++++++++++ 8 files changed, 89 insertions(+), 96 deletions(-) create mode 100644 app/components/gh-psm-visibility-input.hbs create mode 100644 app/components/gh-psm-visibility-input.js delete mode 100644 app/transforms/visibility-string.js create mode 100644 tests/integration/components/gh-psm-visibility-input-test.js diff --git a/app/components/gh-post-settings-menu.hbs b/app/components/gh-post-settings-menu.hbs index fcdcae3f8f..cf8212215e 100644 --- a/app/components/gh-post-settings-menu.hbs +++ b/app/components/gh-post-settings-menu.hbs @@ -77,36 +77,10 @@ {{#if this.showVisibilityInput}} - +
    -
    -
    -
    -
    Public
    -
    -
    -
    -
    -
    -
    Members-only
    -
    - -
    -
    -
    - - + +
    {{/if}} diff --git a/app/components/gh-post-settings-menu.js b/app/components/gh-post-settings-menu.js index 3244b777f0..7f85813742 100644 --- a/app/components/gh-post-settings-menu.js +++ b/app/components/gh-post-settings-menu.js @@ -153,23 +153,6 @@ export default Component.extend(SettingsMenuMixin, { } }, - async setVisibility(segment) { - this.post.set('visibility', segment); - try { - await this.post.validate({property: 'visibility'}); - if (this.post.changedAttributes().visibility) { - await this.savePost.perform(); - } - } catch (e) { - if (!e) { - // validation error - return; - } - - throw e; - } - }, - setCustomExcerpt(excerpt) { let post = this.post; let currentExcerpt = post.get('customExcerpt'); diff --git a/app/components/gh-psm-visibility-input.hbs b/app/components/gh-psm-visibility-input.hbs new file mode 100644 index 0000000000..85ec409c94 --- /dev/null +++ b/app/components/gh-psm-visibility-input.hbs @@ -0,0 +1,10 @@ + + + {{svg-jar "arrow-down-small"}} + \ No newline at end of file diff --git a/app/components/gh-psm-visibility-input.js b/app/components/gh-psm-visibility-input.js new file mode 100644 index 0000000000..a7b5a01fc7 --- /dev/null +++ b/app/components/gh-psm-visibility-input.js @@ -0,0 +1,32 @@ +import Component from '@ember/component'; +import {computed} from '@ember/object'; +import {inject as service} from '@ember/service'; + +const VISIBILITIES = [ + {label: 'Public', name: 'public'}, + {label: 'Members only', name: 'members'}, + {label: 'Paid-members only', name: 'paid'} +]; + +export default Component.extend({ + + settings: service(), + + // public attrs + post: null, + + selectedVisibility: computed('post.visibility', function () { + return this.get('post.visibility') || this.settings.get('defaultContentVisibility'); + }), + + init() { + this._super(...arguments); + this.availableVisibilities = VISIBILITIES; + }, + + actions: { + updateVisibility(newVisibility) { + this.post.set('visibility', newVisibility); + } + } +}); diff --git a/app/models/post.js b/app/models/post.js index 823ea3c0e1..07e922a660 100644 --- a/app/models/post.js +++ b/app/models/post.js @@ -92,7 +92,7 @@ export default Model.extend(Comparable, ValidationEngine, { twitterDescription: attr('string'), emailSubject: attr('string'), html: attr('string'), - visibility: attr('visibility-string'), + visibility: attr('string'), metaDescription: attr('string'), metaTitle: attr('string'), mobiledoc: attr('json-string'), @@ -195,18 +195,6 @@ export default Model.extend(Comparable, ValidationEngine, { } }), - isPublic: computed('visibility', function () { - return this.visibility === 'public' ? true : false; - }), - - visibilitySegment: computed('visibility', 'isPublic', function () { - if (this.isPublic) { - return this.settings.get('defaultContentVisibility') === 'paid' ? 'status:-free' : 'status:free,status:-free'; - } else { - return this.visibility; - } - }), - _getPublishedAtBlogTZ() { let publishedAtUTC = this.publishedAtUTC; let publishedAtBlogDate = this.publishedAtBlogDate; diff --git a/app/transforms/visibility-string.js b/app/transforms/visibility-string.js deleted file mode 100644 index f1f75bab65..0000000000 --- a/app/transforms/visibility-string.js +++ /dev/null @@ -1,29 +0,0 @@ -import Transform from '@ember-data/serializer/transform'; - -// post visibility supports `'members'` and `'paid'` as special-case options -// but that doesn't map well for options in our token select inputs so we -// expand/convert them here to make usage elsewhere easier - -export default class VisibilityString extends Transform { - deserialize(serialized) { - if (serialized === 'members') { - return 'status:free,status:-free'; - } - if (serialized === 'paid') { - return 'status:-free'; - } - - return serialized; - } - - serialize(deserialized) { - if (deserialized === 'status:free,status:-free') { - return 'members'; - } - if (deserialized === 'status:-free') { - return 'paid'; - } - - return deserialized; - } -} diff --git a/app/validators/post.js b/app/validators/post.js index 2e5c05db03..8cb3ba2738 100644 --- a/app/validators/post.js +++ b/app/validators/post.js @@ -9,7 +9,6 @@ export default BaseValidator.create({ 'authors', 'customExcerpt', 'canonicalUrl', - 'visibility', 'codeinjectionHead', 'codeinjectionFoot', 'metaTitle', @@ -67,13 +66,6 @@ export default BaseValidator.create({ } }, - visibility(model) { - if (isBlank(model.visibility) && !model.isNew) { - model.errors.add('visibility', 'A members group must be selected for members-only posts'); - this.invalidate(); - } - }, - codeinjectionFoot(model) { if (!validator.isLength(model.codeinjectionFoot || '', 0, 65535)) { model.errors.add('codeinjectionFoot', 'Footer code cannot be longer than 65535 characters.'); diff --git a/tests/integration/components/gh-psm-visibility-input-test.js b/tests/integration/components/gh-psm-visibility-input-test.js new file mode 100644 index 0000000000..d37721f8ea --- /dev/null +++ b/tests/integration/components/gh-psm-visibility-input-test.js @@ -0,0 +1,43 @@ +import hbs from 'htmlbars-inline-precompile'; +import sinon from 'sinon'; +import {blur, fillIn, find, findAll, render} from '@ember/test-helpers'; +import {describe, it} from 'mocha'; +import {expect} from 'chai'; +import {setupRenderingTest} from 'ember-mocha'; + +describe('Integration: Component: gh-psm-visibility-input', function () { + setupRenderingTest(); + + it('renders', async function () { + this.set('post', { + visibility: 'members' + }); + + await render(hbs`{{gh-psm-visibility-input post=post}}`); + + expect(this.element, 'top-level elements').to.exist; + expect(findAll('option'), 'number of options').to.have.length(3); + expect(find('select').value, 'selected option value').to.equal('members'); + }); + + it('updates post visibility on change', async function () { + let setVisibility = sinon.spy(); + + this.set('post', { + visibility: 'public', + set: setVisibility + }); + + await render(hbs`{{gh-psm-visibility-input post=post}}`); + + expect(this.element, 'top-level elements').to.exist; + expect(findAll('option'), 'number of options').to.have.length(3); + expect(find('select').value, 'selected option value').to.equal('public'); + + await fillIn('select', 'paid'); + await blur('select'); + + expect(setVisibility.calledOnce).to.be.true; + expect(setVisibility.calledWith('visibility', 'paid')).to.be.true; + }); +}); From 0bbfed40eaac57abb2d6d161aa87a6419b7ff1aa Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 17 May 2021 13:28:15 +0530 Subject: [PATCH 0285/3032] Added basic portal settings in new membership area no refs Members related settings are being consolidated into a single screen. - Adds basic portal settings UI --- app/controllers/settings/membership.js | 25 +++++++++++++++++++++++++ app/templates/settings/membership.hbs | 25 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 9023c89c79..57bfc7962d 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -8,6 +8,9 @@ export default class MembersAccessController extends Controller { @service settings; @tracked showLeaveSettingsModal = false; + @tracked showPortalSettings = false; + + queryParams = ['showPortalSettings']; leaveRoute(transition) { if (this.settings.get('hasDirtyAttributes')) { @@ -17,6 +20,28 @@ export default class MembersAccessController extends Controller { } } + @action + async leavePortalSettings() { + this.settings.rollbackAttributes(); + this.showPortalSettings = false; + this.showLeaveSettingsModal = false; + } + + @action + openStripeSettings() { + // Open stripe settings here + } + + @action + closePortalSettings() { + const changedAttributes = this.settings.changedAttributes(); + if (changedAttributes && Object.keys(changedAttributes).length > 0) { + this.showLeaveSettingsModal = true; + } else { + this.showPortalSettings = false; + } + } + @action async confirmLeave() { this.settings.rollbackAttributes(); diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 9496777853..c808340178 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -17,6 +17,23 @@
    +
    +
    +

    Portal settings

    +
    +
    +
    +

    Portal Settings

    + Customize members modal signup flow +
    +
    + +
    +
    +
    +

    Access and payments

    @@ -33,4 +50,12 @@ @modifier="action wide" /> {{/if}} + {{#if this.showPortalSettings}} + + {{/if}}
    \ No newline at end of file From 549ee24165ab5fb13a66bacda23a65cfe951e128 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 17 May 2021 09:42:44 +0100 Subject: [PATCH 0286/3032] Added icons to membership dropdown options no issue - add icon + icon color to the subscription access and default post access option lists - updated templates to use icon in trigger and option display - fixed ember-power-select styles overriding svgs in trigger --- .../settings/members-default-post-access.hbs | 2 ++ .../settings/members-default-post-access.js | 12 +++++++++--- .../settings/members-subscription-access.hbs | 2 ++ .../settings/members-subscription-access.js | 12 +++++++++--- app/styles/components/power-select.css | 4 ++-- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/app/components/settings/members-default-post-access.hbs b/app/components/settings/members-default-post-access.hbs index 07c52be6cf..9005c2b299 100644 --- a/app/components/settings/members-default-post-access.hbs +++ b/app/components/settings/members-default-post-access.hbs @@ -11,9 +11,11 @@ @selected={{this.selectedOption}} @onChange={{this.setDefaultContentVisibility}} @disabled={{eq this.settings.membersSignupAccess "none"}} + @triggerClass="gh-setting-dropdown" as |option| >
    + {{svg-jar option.icon class=(concat "w8 h8 mr2 fill-" (or option.icon_color "green"))}}
    {{option.name}}
    {{option.description}}
    diff --git a/app/components/settings/members-default-post-access.js b/app/components/settings/members-default-post-access.js index 339939ccb7..23dfe5c06b 100644 --- a/app/components/settings/members-default-post-access.js +++ b/app/components/settings/members-default-post-access.js @@ -9,15 +9,21 @@ export default class SettingsMembersDefaultPostAccess extends Component { return [{ name: 'Public', description: 'All site visitors to your site, no login required', - value: 'public' + value: 'public', + icon: 'globe', + icon_color: 'green' }, { name: 'Members only', description: 'All logged-in members', - value: 'members' + value: 'members', + icon: 'globe', + icon_color: 'green' }, { name: 'Paid-members only', description: 'Only logged-in mmembers with an active Stripe subscription', - value: 'paid' + value: 'paid', + icon: 'globe', + icon_color: 'green' }]; } diff --git a/app/components/settings/members-subscription-access.hbs b/app/components/settings/members-subscription-access.hbs index ddce7208cb..ee92614e01 100644 --- a/app/components/settings/members-subscription-access.hbs +++ b/app/components/settings/members-subscription-access.hbs @@ -10,9 +10,11 @@ @options={{this.options}} @selected={{this.selectedOption}} @onChange={{this.setSignupAccess}} + @triggerClass="gh-setting-dropdown" as |option| >
    + {{svg-jar option.icon class=(concat "w8 h8 mr2 fill-" (or option.icon_color "green"))}}
    {{option.name}}
    {{option.description}}
    diff --git a/app/components/settings/members-subscription-access.js b/app/components/settings/members-subscription-access.js index 9141f90878..004e185a00 100644 --- a/app/components/settings/members-subscription-access.js +++ b/app/components/settings/members-subscription-access.js @@ -9,15 +9,21 @@ export default class SettingsMembersSubscriptionAccess extends Component { return [{ name: 'Anyone can sign up', description: 'All visitors will be able to subscribe and sign in', - value: 'all' + value: 'all', + icon: 'globe', + icon_color: 'green' }, { name: 'Only people I invite', description: 'People can sign in from your site but won\'t be able to sign up', - value: 'invite' + value: 'invite', + icon: 'globe', + icon_color: 'green' }, { name: 'Nobody', description: 'No one will be able to subscribe or sign in', - value: 'none' + value: 'none', + icon: 'globe', + icon_color: 'green' }]; } diff --git a/app/styles/components/power-select.css b/app/styles/components/power-select.css index 31f36c9669..1e0102176b 100644 --- a/app/styles/components/power-select.css +++ b/app/styles/components/power-select.css @@ -9,7 +9,7 @@ border: 1px solid color-mod(var(--lightgrey) l(-5%) s(-5%)); } -.ember-power-select-trigger svg { +.ember-power-select-trigger:not(.gh-setting-dropdown) svg { height: 4px; width: 6.11px; margin-left: 2px; @@ -17,7 +17,7 @@ vertical-align: middle; } -.ember-power-select-trigger svg path { +.ember-power-select-trigger:not(.gh-setting-dropdown) svg path { stroke: var(--darkgrey); } From c872130cfa44493a1b033cfc58ee3a16d4c93672 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 17 May 2021 10:15:37 +0100 Subject: [PATCH 0287/3032] Removed products options from members segment select no issue - we're currently limited to a single product so it doesn't make sense to show it as an option as it creates two different routes to "paid members" that we'd like to avoid for now --- app/components/gh-members-segment-select.js | 22 --------------------- 1 file changed, 22 deletions(-) diff --git a/app/components/gh-members-segment-select.js b/app/components/gh-members-segment-select.js index 9c9aae9548..7521ea7c4a 100644 --- a/app/components/gh-members-segment-select.js +++ b/app/components/gh-members-segment-select.js @@ -90,28 +90,6 @@ export default class GhMembersSegmentSelect extends Component { options.push(labelsGroup); } - // fetch all products w̶i̶t̶h̶ c̶o̶u̶n̶t̶s̶ - // TODO: add `include: 'count.members` to query once API supports - const products = yield this.store.query('product', {limit: 'all'}); - - if (products.length > 0) { - const productsGroup = { - groupName: 'Products', - options: [] - }; - - products.forEach((product) => { - productsGroup.options.push({ - name: product.name, - segment: `product:${product.slug}`, - count: product.count?.members, - class: 'segment-product' - }); - }); - - options.push(productsGroup); - } - this._options = options; } } From 5452eaf94d19b75d2ed4b87cf08c5b8cdea37a14 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 17 May 2021 13:01:12 +0200 Subject: [PATCH 0288/3032] Applied basic layout for membership settings - created main blocks - added tier forms - added button for Stripe connect modal --- .../settings/members-subscription-access.hbs | 2 +- app/styles/layouts/members.css | 1 - app/styles/layouts/settings.css | 68 +++++++++ app/styles/patterns/buttons.css | 25 ++++ app/styles/patterns/forms.css | 14 +- app/templates/settings/membership.hbs | 136 +++++++++++++++--- 6 files changed, 221 insertions(+), 25 deletions(-) diff --git a/app/components/settings/members-subscription-access.hbs b/app/components/settings/members-subscription-access.hbs index ee92614e01..eb5d138f8d 100644 --- a/app/components/settings/members-subscription-access.hbs +++ b/app/components/settings/members-subscription-access.hbs @@ -1,4 +1,4 @@ -
    +

    Subscription access

    diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index a40251402c..a3610cb24a 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1541,7 +1541,6 @@ p.gh-members-import-errordetail:first-of-type { } } - /* Custom product member details */ .gh-cp-member-email-name { display: grid; diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 582041e78b..b1b313acb1 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1378,4 +1378,72 @@ p.theme-validation-details { .gh-branding-settings .gh-accent-color .response { margin: -8px 0 0; font-size: 1.3rem; +} + +/* Membership */ +.gh-setting-members-basics { + display: grid; + grid-template-columns: auto 460px; + grid-gap: 32px; +} + +.gh-setting-members-basicsform .intro { + font-size: 1.6rem; +} + +.gh-setting-members-portalpreview { + flex-basis: 460px; + justify-self: end; + font-size: 1.3rem; + font-weight: 500; + color: var(--midgrey); +} + +.gh-setting-richdd-container { + margin: 32px 0; +} + +.gh-setting-members-tierscontainer { + margin-top: 3vmin; +} + +.gh-settings-members-tiersheader { + display: flex; + align-items: flex-end; + justify-content: space-between; +} + +.gh-settings-members-tiersheader .gh-btn-stripe-status { + margin-bottom: 12px; +} + +.gh-settings-members-tiersheader .gh-btn-stripe-status span { + height: 28px; + line-height: 28px; + font-size: 1.25rem; +} + +.gh-setting-members-tierscontainer .gh-expandable:not(:first-of-type) { + margin-top: 20px; +} + +.gh-settings-members-pricelabelcont { + display: flex; + align-items: baseline; +} + +.gh-settings-members-pricelabelcont span { + margin: 0 4px; +} + +.gh-settings-members-pricelabelcont span, +.gh-settings-members-pricelabelcont div { + display: inline-block; + margin-bottom: 4px; +} + +.gh-setting-members-prices { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 20px; } \ No newline at end of file diff --git a/app/styles/patterns/buttons.css b/app/styles/patterns/buttons.css index f060931a6f..e10ad14df9 100644 --- a/app/styles/patterns/buttons.css +++ b/app/styles/patterns/buttons.css @@ -718,3 +718,28 @@ Usage: CTA buttons grouped together horizontally. background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAwCAYAAABuZUjcAAAKRGlDQ1BJQ0MgUHJvZmlsZQAASA2dlndUFNcXx9/MbC+0XZYiZem9twWkLr1IlSYKy+4CS1nWZRewN0QFIoqICFYkKGLAaCgSK6JYCAgW7AEJIkoMRhEVlczGHPX3Oyf5/U7eH3c+8333nnfn3vvOGQAoASECYQ6sAEC2UCKO9PdmxsUnMPG9AAZEgAM2AHC4uaLQKL9ogK5AXzYzF3WS8V8LAuD1LYBaAK5bBIQzmX/p/+9DkSsSSwCAwtEAOx4/l4tyIcpZ+RKRTJ9EmZ6SKWMYI2MxmiDKqjJO+8Tmf/p8Yk8Z87KFPNRHlrOIl82TcRfKG/OkfJSREJSL8gT8fJRvoKyfJc0WoPwGZXo2n5MLAIYi0yV8bjrK1ihTxNGRbJTnAkCgpH3FKV+xhF+A5gkAO0e0RCxIS5cwjbkmTBtnZxYzgJ+fxZdILMI53EyOmMdk52SLOMIlAHz6ZlkUUJLVlokW2dHG2dHRwtYSLf/n9Y+bn73+GWS9/eTxMuLPnkGMni/al9gvWk4tAKwptDZbvmgpOwFoWw+A6t0vmv4+AOQLAWjt++p7GLJ5SZdIRC5WVvn5+ZYCPtdSVtDP6386fPb8e/jqPEvZeZ9rx/Thp3KkWRKmrKjcnKwcqZiZK+Jw+UyL/x7ifx34VVpf5WEeyU/li/lC9KgYdMoEwjS03UKeQCLIETIFwr/r8L8M+yoHGX6aaxRodR8BPckSKPTRAfJrD8DQyABJ3IPuQJ/7FkKMAbKbF6s99mnuUUb3/7T/YeAy9BXOFaQxZTI7MprJlYrzZIzeCZnBAhKQB3SgBrSAHjAGFsAWOAFX4Al8QRAIA9EgHiwCXJAOsoEY5IPlYA0oAiVgC9gOqsFeUAcaQBM4BtrASXAOXARXwTVwE9wDQ2AUPAOT4DWYgSAID1EhGqQGaUMGkBlkC7Egd8gXCoEioXgoGUqDhJAUWg6tg0qgcqga2g81QN9DJ6Bz0GWoH7oDDUPj0O/QOxiBKTAd1oQNYSuYBXvBwXA0vBBOgxfDS+FCeDNcBdfCR+BW+Bx8Fb4JD8HP4CkEIGSEgeggFggLYSNhSAKSioiRlUgxUonUIk1IB9KNXEeGkAnkLQaHoWGYGAuMKyYAMx/DxSzGrMSUYqoxhzCtmC7MdcwwZhLzEUvFamDNsC7YQGwcNg2bjy3CVmLrsS3YC9ib2FHsaxwOx8AZ4ZxwAbh4XAZuGa4UtxvXjDuL68eN4KbweLwa3gzvhg/Dc/ASfBF+J/4I/gx+AD+Kf0MgE7QJtgQ/QgJBSFhLqCQcJpwmDBDGCDNEBaIB0YUYRuQRlxDLiHXEDmIfcZQ4Q1IkGZHcSNGkDNIaUhWpiXSBdJ/0kkwm65KdyRFkAXk1uYp8lHyJPEx+S1GimFLYlESKlLKZcpBylnKH8pJKpRpSPakJVAl1M7WBep76kPpGjiZnKRcox5NbJVcj1yo3IPdcnihvIO8lv0h+qXyl/HH5PvkJBaKCoQJbgaOwUqFG4YTCoMKUIk3RRjFMMVuxVPGw4mXFJ0p4JUMlXyWeUqHSAaXzSiM0hKZHY9O4tHW0OtoF2igdRzeiB9Iz6CX07+i99EllJWV75RjlAuUa5VPKQwyEYcgIZGQxyhjHGLcY71Q0VbxU+CqbVJpUBlSmVeeoeqryVYtVm1Vvqr5TY6r5qmWqbVVrU3ugjlE3VY9Qz1ffo35BfWIOfY7rHO6c4jnH5tzVgDVMNSI1lmkc0OjRmNLU0vTXFGnu1DyvOaHF0PLUytCq0DqtNa5N03bXFmhXaJ/RfspUZnoxs5hVzC7mpI6GToCOVGe/Tq/OjK6R7nzdtbrNug/0SHosvVS9Cr1OvUl9bf1Q/eX6jfp3DYgGLIN0gx0G3QbThkaGsYYbDNsMnxipGgUaLTVqNLpvTDX2MF5sXGt8wwRnwjLJNNltcs0UNnUwTTetMe0zg80czQRmu836zbHmzuZC81rzQQuKhZdFnkWjxbAlwzLEcq1lm+VzK32rBKutVt1WH60drLOs66zv2SjZBNmstemw+d3W1JZrW2N7w45q52e3yq7d7oW9mT3ffo/9bQeaQ6jDBodOhw+OTo5ixybHcSd9p2SnXU6DLDornFXKuuSMdfZ2XuV80vmti6OLxOWYy2+uFq6Zroddn8w1msufWzd3xE3XjeO2323Ineme7L7PfchDx4PjUevxyFPPk+dZ7znmZeKV4XXE67m3tbfYu8V7mu3CXsE+64P4+PsU+/T6KvnO9632fein65fm1+g36e/gv8z/bAA2IDhga8BgoGYgN7AhcDLIKWhFUFcwJTgquDr4UYhpiDikIxQODQrdFnp/nsE84by2MBAWGLYt7EG4Ufji8B8jcBHhETURjyNtIpdHdkfRopKiDke9jvaOLou+N994vnR+Z4x8TGJMQ8x0rE9seexQnFXcirir8erxgvj2BHxCTEJ9wtQC3wXbF4wmOiQWJd5aaLSwYOHlReqLshadSpJP4iQdT8YmxyYfTn7PCePUcqZSAlN2pUxy2dwd3Gc8T14Fb5zvxi/nj6W6pZanPklzS9uWNp7ukV6ZPiFgC6oFLzICMvZmTGeGZR7MnM2KzWrOJmQnZ58QKgkzhV05WjkFOf0iM1GRaGixy+LtiyfFweL6XCh3YW67hI7+TPVIjaXrpcN57nk1eW/yY/KPFygWCAt6lpgu2bRkbKnf0m+XYZZxl3Uu11m+ZvnwCq8V+1dCK1NWdq7SW1W4anS1/+pDa0hrMtf8tNZ6bfnaV+ti13UUahauLhxZ77++sUiuSFw0uMF1w96NmI2Cjb2b7Dbt3PSxmFd8pcS6pLLkfSm39Mo3Nt9UfTO7OXVzb5lj2Z4tuC3CLbe2emw9VK5YvrR8ZFvottYKZkVxxavtSdsvV9pX7t1B2iHdMVQVUtW+U3/nlp3vq9Orb9Z41zTv0ti1adf0bt7ugT2ee5r2au4t2ftun2Df7f3++1trDWsrD+AO5B14XBdT1/0t69uGevX6kvoPB4UHhw5FHupqcGpoOKxxuKwRbpQ2jh9JPHLtO5/v2pssmvY3M5pLjoKj0qNPv0/+/tax4GOdx1nHm34w+GFXC62luBVqXdI62ZbeNtQe395/IuhEZ4drR8uPlj8ePKlzsuaU8qmy06TThadnzyw9M3VWdHbiXNq5kc6kznvn487f6Iro6r0QfOHSRb+L57u9us9ccrt08rLL5RNXWFfarjpebe1x6Gn5yeGnll7H3tY+p772a87XOvrn9p8e8Bg4d93n+sUbgTeu3px3s//W/Fu3BxMHh27zbj+5k3Xnxd28uzP3Vt/H3i9+oPCg8qHGw9qfTX5uHnIcOjXsM9zzKOrRvRHuyLNfcn95P1r4mPq4ckx7rOGJ7ZOT437j154ueDr6TPRsZqLoV8Vfdz03fv7Db56/9UzGTY6+EL+Y/b30pdrLg6/sX3VOhU89fJ39ema6+I3am0NvWW+738W+G5vJf49/X/XB5EPHx+CP92ezZ2f/AAOY8/wRDtFgAAAHH0lEQVRoBdVZ628UVRS/857dme3strvblpaXCiI+WkCkpFAoECAgr0oqxASjiAZMiF9MiI80/AfqB+WD3/xABOMrKCgRJCBSLCACQUEIEai8ywJ97GNm/J3ZbizM7C7trpG9m7N39t5z7/2dM+eec+5dzrZtVoqFL0XQhLlkgYulpnGOYxxhLjngW7Zsdayk5IB3RyJSSWrcMP1aSQJPJfnwoIA3LFhTy3hrAdx+IzbIOMbsGkQAR3pM1Icdcxv1ZZtxf+D5OGPm3vbJo4/YbW0WLVSswglCLc3F5QtAzyx6ZbbA7Hc5jp8hCAIj4nmecTy2NyRwCqShOEZzWZbFTMtkpmky27Ku2Da36cC2j9vSjIV/b93RsZpmybo5n2htlct6yz6SReFlWZaZIitMURRGz6IkMoEXHPAOFAewnQacSrFkMsUSiTgoEU0kk4vBUzTgHM87GvcE3traKgTjxleyT5mvaTrTdY2pqo9JBNjReBp0v0sFLtI4tA2ClqFtIpPF43EIEdcd4Yr0hSWy23hnIvi2T/PPDwaDLBAIMFVRmSACbMY0XCDSImTCsOOvYDr0hqxUQnGxF9AA4/T2Ks2LXwsD9Iby8nIWNIJMVmTGZwWcAwFW4AWIYmfEycE7mC6OZfHjqviCYZT5gobhaIw24VALjRz6aO9Vsdm9I6eu6XN1mIcC8+ALAO0sS28qvY43iiG0csxydOHanJqm1ZFNk8vLp67hVeHjLfMbvx9ZHY7Fbvco17pi2vlL1youXemKXLh8Y8SV610jelPJIcDLP8QFXJHlELm77BsxPaltW6xx4vgDo2uiN6klZOh9RGNG1VzHz1Ogn6j99LkLcaqLXVzA4acRnIS82k6lTLbjx/aqhgmPvglQMZAMItcXAkVAw4nGjKq9hbroxQVcVeVenuN9//po7zUpQp44ffbZOSvWb48nEhv3fr5pBzhJu6TxP0E/g6iUpavifrt8VUXIuEC27eyrHDVFTtoLiqo2SKK4vem5tQebWl5dwW3ceO+c/4nG712EwUaPIhDmRU5RtMwoY5FwhIXg83VNmyxJ6uamY5ePNbWsXVFc/bpncwFfMnvqN4oi3iRTyfXh+zVO0bUyGmXRykpWXkEC6ONlWdo8c/m6L+atWpXJHt0rF9jiAq7rvpPzGuu/hqlYjjskr5mFKDiRB/Ijtw8FQywaibJKCEBvwOf3L032lf0wbcnqQIEYPYe7gIPrRPPU+kONk8Z/jVAPb38fH0gpiiLA+lgwaDgCRMJhJGf6FFXV3vNcucBGL+Am5ty2dM6UjkWzp3ziU+Vb+TZqpp9yGhLADwFCoXKYTgVD3vPSrBXr6wrE6RruBZyYzoK+nT7psdMb1rS8P+Hxh3bKstiT19X0S4CcGSmDzAzkO9gDHHL5510rF9jg8uMD5juC55jfry5aubBpb+xOz8Fd+3+rO3bqr6ndvX0VA/i8HyEEHT4CeoAl4/GFYHrLm3Fordk0npmNNP8haJeh+7uWzW04+M665R9MmzT+S0kU+jImkq2mJE1RFab6fA9nJixWnUvjmTUoS6K84xfQU0i+piya9fRhjrftfR2/L3M8TobToxYFEScnqehu0QW8ufX1eoGXJPNy6Mju3W2pAVgSeO4AHQLV+SR5pIVES+CQ1+QolPeoqlr0RMsFXJTkpXDbbVxVV/eclW+04wjTDod4HGe907aQuiImOV7RfbXVVdWNeqCMCUpu4ORM4Zl6csg2pC4X8GHRsNbdl6BrBs1MpWbh4DuLrhvoEGzZODVJHA7GPOuLJ5iG0ELAchUcn5mh63/n4hlKnwt4bW11uCvW65x+cLXAkgkQDgMpXDtQRkhAydXRKQnJVTqq5liZTv/V0dDJHCyD6rIZT5mU+15Fgk36/X7n/oQ0beGawQTgtMZxT4UP2a1zt4I6n8bxPlLNU+u+GxS6HMwch43lBZzu+tHpXPaIPDRKWi2gPDKi6sDo2sqjBUxx91CbOWdBN6r+hCqfJu+ezfuXEfCdX7lw+k70nvDmGHwr7KSbRrmA9+POa7v5lgwHA2debJn5KSIvxQBnsXxj7qcfwe4a8bmAD4tWnLp6s7uzN2lWw33kdhkeK/lUpat+3Kg9C2ZMPIzuC6A9HmxDbsJeozndwNesXLCf2mO376gnz3TW4Jph2I3Y7cidnr7ynt54MJky/ZZli8jFTZHnE7Ikdmt+9Ua0wjg/bvSwM0+OHXER0ZV2PqULn4EGBjH8LKzgJH+OZnBpHG3kczuNgF7dUD/2DJ6JBlO6wLwP9OtgBt0vr22a3hrHBHQnQkSXlTWgahBlg+WgIMgHIoEpb6cdTvZ7A3QRRFruBDm+FnXRiyhZ3jY+YCXKLwgI0QNTYkKPt1d5YBBmAaJdver48bx/pWQZ/781wx06nq7kgGc0lu8ElOF74OqSBf4P9hj31KSAw4AAAAAASUVORK5CYII="); } } + + +.gh-btn-stripe-status { + position: relative; + box-shadow: none; + color: var(--darkgrey-l2); + padding-left: 12px; +} + +.gh-btn-stripe-status::before { + position: absolute; + content: ""; + display: block; + top: 0; + bottom: 0; + height: 6px; + width: 6px; + margin: auto; + background: var(--midlightgrey); + border-radius: 999px; +} + +.gh-btn-stripe-status.connected:before { + background: var(--green); +} \ No newline at end of file diff --git a/app/styles/patterns/forms.css b/app/styles/patterns/forms.css index e4fe395999..f56f6224e7 100644 --- a/app/styles/patterns/forms.css +++ b/app/styles/patterns/forms.css @@ -647,11 +647,6 @@ textarea { min-width: 0; /* Firefox fix */ } -.form-group:not(.error) .gh-input-group .gh-input:focus + .gh-input-append { - border-color: color-mod(var(--green)); - box-shadow: inset 0 0 0 1px var(--green); -} - .gh-input-group .gh-input:focus + .gh-input-append, .gh-input-group .gh-input:focus + .gh-input-append:before { background: var(--white); @@ -679,6 +674,15 @@ textarea { color: var(--midlightgrey); } +.gh-expandable-content .gh-input-append { + border-color: var(--whitegrey-d1); +} + +.form-group:not(.error) .gh-input-group .gh-input:focus + .gh-input-append { + border-color: color-mod(var(--green)); + box-shadow: inset 0 0 0 1px var(--green); +} + .gh-input-append:before { position: absolute; content: ""; diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index c808340178..2ea95a4737 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -7,7 +7,7 @@
    -
    -

    Portal settings

    -
    -
    -
    -

    Portal Settings

    - Customize members modal signup flow + +
    +
    +

    Fund your work with subscription revenue. Connect your Stripe account and offer premium content to your audience. Our creators are already making over $2 million per year, while Ghost takes 0% payment fees.

    + +
    +
    +
    +
    +

    Portal Settings

    +

    + Customize members modal signup flow +

    +
    +
    + +
    +
    +
    +
    + +
    + + +
    -
    - +
    + PORTAL PREVIEW
    -
    -
    -
    -

    Access and payments

    +
    +
    +

    Membership tiers

    + +
    +
    +
    +
    +
    +

    Free

    +

    Free membership signup settings

    +
    + +
    +
    + {{#liquid-if this.freeOpen}} +
    + + + + +

    Redirect to this URL after signup for a free membership

    +
    +
    + {{/liquid-if}} +
    +
    +
    +
    +
    +
    +
    +

    Premium

    +

    Customise prices and premium signup options

    +
    + +
    +
    + {{#liquid-if this.paidOpen}} +
    + +
    + + +
    USD
    +
    +
    +
    + +
    USD/month
    +
    +
    + +
    USD/year
    +
    +
    + +
    + + + + + +

    Redirect to this URL after signup for premium membership

    +
    +
    + {{/liquid-if}} +
    +
    +
    - -
    {{#if this.showLeaveSettingsModal}} From 18af45b346df5ad0521b0d2d892379f8e5164934 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 17 May 2021 13:35:31 +0200 Subject: [PATCH 0289/3032] Membership settings UI refinements - added Portal mock container and background - updated header behavior --- app/styles/layouts/settings.css | 42 +++++++++++++++++++++++++++ app/templates/settings.hbs | 25 ++-------------- app/templates/settings/membership.hbs | 10 ++++--- 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index b1b313acb1..3c90410058 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1381,6 +1381,25 @@ p.theme-validation-details { } /* Membership */ +.gh-setting-members-header { + position: relative; + background: none; +} + +.gh-setting-members-canvas::before { + position: absolute; + display: block; + content: ""; + top: -450px; + right: -250px; + width: 970px; + height: 970px; + border-radius: 50%; + z-index: 0; + background: var(--main-color-content-greybg); + opacity: 0.5; +} + .gh-setting-members-basics { display: grid; grid-template-columns: auto 460px; @@ -1391,6 +1410,10 @@ p.theme-validation-details { font-size: 1.6rem; } +.gh-setting-members-portalcta { + background: linear-gradient(to left, color-mod(var(--main-color-content-greybg) l(-3%)), var(--main-color-content-greybg)); +} + .gh-setting-members-portalpreview { flex-basis: 460px; justify-self: end; @@ -1446,4 +1469,23 @@ p.theme-validation-details { display: grid; grid-template-columns: 1fr 1fr; grid-gap: 20px; +} + +.gh-setting-members-portal-mock { + display: flex; + align-items: center; + justify-content: center; + background: #fff; + box-shadow: + 0 2.8px 2.2px rgba(0, 0, 0, 0.02), + 0 6.7px 5.3px rgba(0, 0, 0, 0.028), + 0 12.5px 10px rgba(0, 0, 0, 0.035), + 0 22.3px 17.9px rgba(0, 0, 0, 0.042), + 0 41.8px 33.4px rgba(0, 0, 0, 0.05), + 0 100px 80px rgba(0, 0, 0, 0.07) + ; + width: 420px; + height: 582px; + margin-bottom: 60px; + border-radius: 5px; } \ No newline at end of file diff --git a/app/templates/settings.hbs b/app/templates/settings.hbs index feb7327224..6e2e1c4f78 100644 --- a/app/templates/settings.hbs +++ b/app/templates/settings.hbs @@ -41,26 +41,12 @@
    Members
    - {{svg-jar "eye"}} + {{svg-jar "portal-logo-stroke"}}

    Membership

    -

    REPLACE ME

    +

    Access, prices and sign-up options

    - - {{svg-jar "module"}} -
    -

    Products

    -

    Set up subscription products and prices

    -
    -
    - {{#if this.session.user.isOwner}} {{svg-jar "email-stroke"}} @@ -69,13 +55,6 @@

    Customise emails and set email addresses

    - - {{svg-jar "piggy-bank"}} -
    -

    Payments

    -

    Stripe connection settings

    -
    -
    {{/if}}
    diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 2ea95a4737..768181ef2a 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -1,5 +1,5 @@ -
    - +
    +

    Settings {{svg-jar "arrow-right"}} @@ -23,7 +23,7 @@

    Fund your work with subscription revenue. Connect your Stripe account and offer premium content to your audience. Our creators are already making over $2 million per year, while Ghost takes 0% payment fees.

    -
    +
    @@ -34,7 +34,7 @@
    @@ -47,7 +47,9 @@
    +
    PORTAL PREVIEW +

    From b07c37f65e2047b68138c803203531c9fd6adf3e Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 17 May 2021 12:40:08 +0100 Subject: [PATCH 0290/3032] Fixed errors when closing portal settings modal no issue - added actions for handling close/confirm/cancel of portal settings rather than re-using the route-level leave modal because the portal settings modal does not need any knowledge of the route - added controller reset that is called when the route is exited to ensure no modals are shown when navigating back to the membership screen - fixed "cannot set on destroyed" error when portal settings are opened and closed quickly - removed usage of old `{{action}}` helper - this has been replaced with `{{on}}` and `{{fn}}` --- app/components/modal-portal-settings.js | 4 ++- app/controllers/settings/membership.js | 46 +++++++++++++++++-------- app/routes/settings/membership.js | 6 ++++ app/templates/settings/membership.hbs | 24 +++++++++---- 4 files changed, 57 insertions(+), 23 deletions(-) diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index d189c3ffe6..5c4c50108d 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -153,7 +153,9 @@ export default ModalComponent.extend({ this._super(...arguments); this.get('settings.errors').clear(); run.later(this, function () { - this.set('hidePreviewFrame', false); + if (!this.isDestroyed && !this.isDestroying) { + this.set('hidePreviewFrame', false); + } }, 1200); }, diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 57bfc7962d..dc35efd665 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -7,7 +7,8 @@ import {tracked} from '@glimmer/tracking'; export default class MembersAccessController extends Controller { @service settings; - @tracked showLeaveSettingsModal = false; + @tracked showLeavePortalModal = false; + @tracked showLeaveRouteModal = false; @tracked showPortalSettings = false; queryParams = ['showPortalSettings']; @@ -16,42 +17,51 @@ export default class MembersAccessController extends Controller { if (this.settings.get('hasDirtyAttributes')) { transition.abort(); this.leaveSettingsTransition = transition; - this.showLeaveSettingsModal = true; + this.showLeaveRouteModal = true; } } - @action - async leavePortalSettings() { - this.settings.rollbackAttributes(); - this.showPortalSettings = false; - this.showLeaveSettingsModal = false; - } - - @action - openStripeSettings() { - // Open stripe settings here + @action openPortalSettings() { + this.saveSettingsTask.perform(); + this.showPortalSettings = true; } @action closePortalSettings() { const changedAttributes = this.settings.changedAttributes(); if (changedAttributes && Object.keys(changedAttributes).length > 0) { - this.showLeaveSettingsModal = true; + this.showLeavePortalModal = true; } else { this.showPortalSettings = false; } } + @action + async confirmClosePortalSettings() { + this.settings.rollbackAttributes(); + this.showPortalSettings = false; + this.showLeavePortalModal = false; + } + + @action + cancelClosePortalSettings() { + this.showLeavePortalModal = false; + } + + @action + openStripeSettings() { + // Open stripe settings here + } + @action async confirmLeave() { this.settings.rollbackAttributes(); - this.showLeaveSettingsModal = false; this.leaveSettingsTransition.retry(); } @action cancelLeave() { - this.showLeaveSettingsModal = false; + this.showLeaveRouteModal = false; this.leaveSettingsTransition = null; } @@ -59,4 +69,10 @@ export default class MembersAccessController extends Controller { *saveSettingsTask() { return yield this.settings.save(); } + + reset() { + this.showLeaveRouteModal = false; + this.showLeavePortalModal = false; + this.showPortalSettings = false; + } } diff --git a/app/routes/settings/membership.js b/app/routes/settings/membership.js index 7448b24b48..fe954ac0b5 100644 --- a/app/routes/settings/membership.js +++ b/app/routes/settings/membership.js @@ -19,4 +19,10 @@ export default class MembershipSettingsRoute extends AuthenticatedRoute { titleToken: 'Settings - Membership' }; } + + resetController(controller, isExiting) { + if (isExiting) { + controller.reset(); + } + } } diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 768181ef2a..95733e5f34 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -33,14 +33,14 @@

    -
    - +
    @@ -67,7 +67,7 @@

    Free

    Free membership signup settings

    - +
    {{#liquid-if this.freeOpen}} @@ -94,7 +94,7 @@

    Premium

    Customise prices and premium signup options

    - +
    {{#liquid-if this.paidOpen}} @@ -144,7 +144,7 @@
    - {{#if this.showLeaveSettingsModal}} + {{#if this.showLeaveRouteModal}} {{/if}} + {{#if this.showPortalSettings}} {{/if}} + + {{#if this.showLeavePortalModal}} + + {{/if}} \ No newline at end of file From 8f1dcc50e3075e0f862e9107f0b3389390128211 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 17 May 2021 19:59:07 +0530 Subject: [PATCH 0291/3032] Wired membership tiers UI in new members setting no refs - Wired Premium membership UI to existing monthly/yearly prices in the default product - Wired free membership UI to redirect URI setting - Updated save to validate settings/errors --- app/controllers/settings/membership.js | 144 +++++++++++++++++++++++++ app/styles/layouts/settings.css | 24 ++++- app/templates/settings/membership.hbs | 113 ++++++++++++------- app/utils/currency.js | 31 ++++++ 4 files changed, 272 insertions(+), 40 deletions(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index dc35efd665..369417f334 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -1,18 +1,38 @@ import Controller from '@ember/controller'; import {action} from '@ember/object'; +import {getCurrencyOptions, getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; import {tracked} from '@glimmer/tracking'; export default class MembersAccessController extends Controller { @service settings; + @service store; + @service config; @tracked showLeavePortalModal = false; @tracked showLeaveRouteModal = false; @tracked showPortalSettings = false; + @tracked product = null; + @tracked stripePrices = []; + @tracked paidSignupRedirect; + @tracked freeSignupRedirect; + @tracked stripeMonthlyAmount = 5; + @tracked stripeYearlyAmount = 50; + @tracked currency = 'usd'; + @tracked stripePlanError = ''; + queryParams = ['showPortalSettings']; + constructor(...args) { + super(...args); + this.siteUrl = this.config.get('blogUrl'); + this.fetchDefaultProduct.perform(); + + this.allCurrencies = getCurrencyOptions(); + } + leaveRoute(transition) { if (this.settings.get('hasDirtyAttributes')) { transition.abort(); @@ -21,11 +41,77 @@ export default class MembersAccessController extends Controller { } } + _validateSignupRedirect(url, type) { + let errMessage = `Please enter a valid URL`; + this.settings.get('errors').remove(type); + this.settings.get('hasValidated').removeObject(type); + + if (url === null) { + this.settings.get('errors').add(type, errMessage); + this.settings.get('hasValidated').pushObject(type); + return false; + } + + if (url === undefined) { + // Not initialised + return; + } + + if (url.href.startsWith(this.siteUrl)) { + const path = url.href.replace(this.siteUrl, ''); + this.settings.set(type, path); + } else { + this.settings.set(type, url.href); + } + } + @action openPortalSettings() { this.saveSettingsTask.perform(); this.showPortalSettings = true; } + @action + setStripePlansCurrency(event) { + const newCurrency = event.value; + this.currency = newCurrency; + } + + @action + setPaidSignupRedirect(url) { + this.paidSignupRedirect = url; + } + + @action + setFreeSignupRedirect(url) { + this.freeSignupRedirect = url; + } + + @action + validatePaidSignupRedirect() { + return this._validateSignupRedirect(this.paidSignupRedirect, 'membersPaidSignupRedirect'); + } + + @action + validateFreeSignupRedirect() { + return this._validateSignupRedirect(this.freeSignupRedirect, 'membersFreeSignupRedirect'); + } + + @action + validateStripePlans() { + this.stripePlanError = undefined; + + try { + const yearlyAmount = this.stripeYearlyAmount; + const monthlyAmount = this.stripeMonthlyAmount; + const symbol = getSymbol(this.currency); + if (!yearlyAmount || yearlyAmount < 1 || !monthlyAmount || monthlyAmount < 1) { + throw new TypeError(`Subscription amount must be at least ${symbol}1.00`); + } + } catch (err) { + this.stripePlanError = err.message; + } + } + @action closePortalSettings() { const changedAttributes = this.settings.changedAttributes(); @@ -65,8 +151,66 @@ export default class MembersAccessController extends Controller { this.leaveSettingsTransition = null; } + saveProduct() { + if (this.product) { + const stripePrices = this.product.stripePrices || []; + if (this.stripeMonthlyAmount && this.stripeYearlyAmount) { + stripePrices.push( + { + nickname: 'Monthly', + amount: this.stripeMonthlyAmount * 100, + active: 1, + currency: this.currency, + interval: 'month', + type: 'recurring' + }, + { + nickname: 'Yearly', + amount: this.stripeYearlyAmount * 100, + active: 1, + currency: this.currency, + interval: 'year', + type: 'recurring' + } + ); + this.product.set('stripePrices', stripePrices); + return this.product; + } else { + return this.product; + } + } + } + + @task({drop: true}) + *fetchDefaultProduct() { + const products = yield this.store.query('product', {include: 'stripe_prices'}); + this.product = products.firstObject; + this.stripePrices = []; + if (this.product) { + this.stripePrices = this.product.get('stripePrices'); + const monthlyPrice = this.stripePrices.find(d => d.nickname === 'Monthly'); + const yearlyPrice = this.stripePrices.find(d => d.nickname === 'Yearly'); + if (monthlyPrice && monthlyPrice.amount) { + this.stripeMonthlyAmount = (monthlyPrice.amount / 100); + this.currency = monthlyPrice.currency; + } + if (yearlyPrice && yearlyPrice.amount) { + this.stripeYearlyAmount = (yearlyPrice.amount / 100); + } + } + } + @task({drop: true}) *saveSettingsTask() { + yield this.validateStripePlans(); + + if (this.stripePlanError) { + return; + } + + if (this.settings.get('errors').length !== 0) { + return; + } return yield this.settings.save(); } diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 3c90410058..38fcfb5187 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -225,7 +225,7 @@ align-self: center; } -.gh-setting-action .for-checkbox label, +.gh-setting-action .for-checkbox label, .gh-setting-action .for-radio label { padding-bottom: 0; margin-bottom: 0; @@ -1465,6 +1465,26 @@ p.theme-validation-details { margin-bottom: 4px; } +.gh-settings-members-pricelabelcont .gh-select { + padding: 0; + width: 320px; + background: transparent; + border: none; +} + +.gh-settings-members-pricelabelcont .gh-select select { + background: transparent; + border: none; + padding: 0; +} + +.gh-settings-members-pricelabelcont .gh-select svg { + position: absolute; + bottom: unset; + width: 12px; + margin-right: unset; +} + .gh-setting-members-prices { display: grid; grid-template-columns: 1fr 1fr; @@ -1488,4 +1508,4 @@ p.theme-validation-details { height: 582px; margin-bottom: 60px; border-radius: 5px; -} \ No newline at end of file +} diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 95733e5f34..2adcdd7b65 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -74,12 +74,18 @@
    - + -

    Redirect to this URL after signup for a free membership

    @@ -99,43 +105,74 @@
    {{#liquid-if this.paidOpen}}
    - -
    - - -
    USD
    -
    -
    -
    - -
    USD/month
    + {{#if this.fetchDefaultProduct.isRunning}} + Loading... + {{else}} + +
    + + +
    + + + {{svg-jar "arrow-down-small"}} + +
    -
    - -
    USD/year
    +
    + +
    + + {{this.currency}}/month +
    +
    + + {{this.currency}}/month +
    -
    - -
    + {{#if this.stripePlanError}} +

    {{this.stripePlanError}}

    + {{/if}} + - - - - -

    Redirect to this URL after signup for premium membership

    -
    + + + + +

    Redirect to this URL after signup for premium membership

    +
    + {{/if}}
    {{/liquid-if}}
    diff --git a/app/utils/currency.js b/app/utils/currency.js index f460f1f8f3..db68c48522 100644 --- a/app/utils/currency.js +++ b/app/utils/currency.js @@ -128,3 +128,34 @@ export function getSymbol(currency) { export function getNonDecimal(amount/*, currency*/) { return amount / 100; } + +export function getCurrencyOptions() { + const noOfTopCurrencies = 5; + + const topCurrencies = currencies.slice(0, noOfTopCurrencies).map((currency) => { + return { + value: currency.isoCode.toLowerCase(), + label: `${currency.isoCode} - ${currency.name}`, + isoCode: currency.isoCode + }; + }); + + const otherCurrencies = currencies.slice(noOfTopCurrencies, currencies.length).map((currency) => { + return { + value: currency.isoCode.toLowerCase(), + label: `${currency.isoCode} - ${currency.name}`, + isoCode: currency.isoCode + }; + }); + + return [ + { + groupName: '—', + options: topCurrencies + }, + { + groupName: '—', + options: otherCurrencies + } + ]; +} From d30b14a33ff6efae3f23b8c624d112f6f831c4e9 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 17 May 2021 17:14:38 +0200 Subject: [PATCH 0292/3032] Moved Stripe connect settings to modal --- app/components/gh-fullscreen-modal.js | 2 +- .../gh-members-payments-setting.hbs | 269 +++++++----------- app/components/gh-members-payments-setting.js | 4 + app/components/modal-stripe-connect.hbs | 30 ++ app/components/modal-stripe-connect.js | 21 ++ app/controllers/settings/membership.js | 11 + app/styles/layouts/labs.css | 113 -------- app/styles/layouts/settings.css | 180 +++++++++++- app/templates/settings/membership.hbs | 22 +- public/assets/icons/check-circle-stroke.svg | 1 + 10 files changed, 368 insertions(+), 285 deletions(-) create mode 100644 app/components/modal-stripe-connect.hbs create mode 100644 app/components/modal-stripe-connect.js create mode 100644 public/assets/icons/check-circle-stroke.svg diff --git a/app/components/gh-fullscreen-modal.js b/app/components/gh-fullscreen-modal.js index 5b9493c470..0042932924 100644 --- a/app/components/gh-fullscreen-modal.js +++ b/app/components/gh-fullscreen-modal.js @@ -16,7 +16,7 @@ const FullScreenModalComponent = Component.extend({ return `modal-${this.modal || 'unknown'}`; }), - modalClasses: computed('modifiers', function () { + modalClasses: computed('modifier', function () { let modalClass = 'fullscreen-modal'; let modifiers = (this.modifier || '').split(' '); let modalClasses = emberA([modalClass]); diff --git a/app/components/gh-members-payments-setting.hbs b/app/components/gh-members-payments-setting.hbs index 4c3a501c80..6b39b24089 100644 --- a/app/components/gh-members-payments-setting.hbs +++ b/app/components/gh-members-payments-setting.hbs @@ -1,188 +1,125 @@
    -

    -
    - - {{#if this.stripeDirect}} - -
    -
    -
    -

    Connect to Stripe

    -

    Configure API keys to create subscriptions and take payments

    + {{#if this.stripeDirect}} +
    +
    +
    +
    + + +
    + -
    -
    - {{#liquid-if this.membersStripeOpen}} -
    -
    -
    - - -
    -
    - - - - Find your Stripe API keys here » - -
    -
    -
    -
    -
    -

    How you get paid

    - {{svg-jar "stripe-verified-partner-badge" class="gh-members-stripe-badge"}} -
    -

    - Stripe is our exclusive direct payments partner.
    - Ghost collects no fees on any payments! If you don’t have a Stripe account yet, you can sign up here. -

    -
    -
    +
    +
    +
    +

    How you get paid

    + {{svg-jar "stripe-verified-partner-badge" class="gh-members-stripe-badge"}}
    - {{/liquid-if}} +

    + Stripe is our exclusive direct payments partner.
    + Ghost collects no fees on any payments! If you don’t have a Stripe account yet, you can sign up here. +

    +
    +
    - {{else}} +
    + +
    -
    -
    -
    -

    Connect to Stripe

    -

    - {{#if this.stripeConnectAccountId}} - {{#if this.hasActiveStripeSubscriptions}} - - Cannot disconnect while there are members with active Stripe subscriptions. - - {{else}} - - {{#if this.stripeConnectSuccess}} - {{svg-jar "check-circle" class="stroke-green w4 h4 nudge-top--3"}} Successfully connected to {{this.stripeConnectAccountName}} - {{else}} - Connected to {{this.stripeConnectAccountName}} - {{/if}} + {{else}} - {{#unless this.stripeConnectLivemode}} - Test mode - {{/unless}} - - {{/if}} - {{else}} - Connect to Stripe to create subscriptions and take payments - {{/if}} -

    -
    - {{#if this.stripeConnectAccountId}} - - {{else}} - + {{#if this.stripeConnectAccountId}} +
    + {{svg-jar "check-circle-stroke" class="check-circle"}} +

    You are connected to Stripe

    +
    +

    Connected to {{this.stripeConnectAccountName}}

    + {{#unless this.stripeConnectLivemode}} +
    Test mode
    + {{/unless}} + + {{#if this.hasActiveStripeSubscriptions}} + + Cannot disconnect while there are members with active Stripe subscriptions. + {{/if}}
    -
    - {{#liquid-if this.membersStripeOpen}} -
    -
    -
    - -
    - Connect with Stripe -
    - {{if this.stripeConnectTestMode "Using" "Use"}} test mode -
    - -
    -
    -
    -
    - - {{#if this.stripeConnectError}}

    {{this.stripeConnectError}}

    {{/if}} -
    -
    -
    -
    -
    -

    How you get paid

    - {{svg-jar "stripe-verified-partner-badge" class="gh-members-stripe-badge"}} -
    -

    - Stripe is our exclusive direct payments partner.
    - Ghost collects no fees on any payments! If you don’t have a Stripe account yet, you can sign up here. -

    -
    + +
    + {{else}} +
    +
    + +
    + Connect with Stripe +
    + {{if this.stripeConnectTestMode "Using" "Use"}} test mode +
    +
    - -
    - +
    +
    + + {{#if this.stripeConnectError}}

    {{this.stripeConnectError}}

    {{/if}} +
    +
    +
    +
    +
    +

    Getting paid

    + {{svg-jar "stripe-verified-partner-badge" class="gh-members-stripe-badge"}}
    +

    + Stripe is our exclusive direct payments partner.
    + Ghost collects no fees on any payments! If you don’t have a Stripe account yet, you can sign up here. +

    - {{/liquid-if}}
    - {{/if}} - - {{!--
    -
    -
    -

    Subscription pricing

    -

    Set default subscription currency

    -
    - -
    -
    - {{#liquid-if this.membersPricingOpen}} -
    -
    - - - - {{one-way-select this.selectedCurrency - id="currency" - name="currency" - options=(readonly this.allCurrencies) - optionValuePath="value" - optionLabelPath="label" - update=(action "setStripePlansCurrency") - }} - {{svg-jar "arrow-down-small"}} - - -
    -
    -
    - -
    - {{/liquid-if}} +
    +
    -
    --}} -
    + {{/if}} + {{/if}}
    {{#if this.showDisconnectStripeConnectModal}} diff --git a/app/components/gh-members-payments-setting.js b/app/components/gh-members-payments-setting.js index 532653f454..3b54b5eb29 100644 --- a/app/components/gh-members-payments-setting.js +++ b/app/components/gh-members-payments-setting.js @@ -248,6 +248,10 @@ export default Component.extend({ } }).drop(), + saveSettings: task(function* () { + return yield this.settings.save(); + }).drop(), + get liveStripeConnectAuthUrl() { return this.ghostPaths.url.api('members/stripe_connect') + '?mode=live'; }, diff --git a/app/components/modal-stripe-connect.hbs b/app/components/modal-stripe-connect.hbs new file mode 100644 index 0000000000..a0231d31c4 --- /dev/null +++ b/app/components/modal-stripe-connect.hbs @@ -0,0 +1,30 @@ +{{#unless this.settings.stripeConnectAccountId}} + +{{/unless}} + + +
    + +
    + + \ No newline at end of file diff --git a/app/components/modal-stripe-connect.js b/app/components/modal-stripe-connect.js new file mode 100644 index 0000000000..3b8d8c9309 --- /dev/null +++ b/app/components/modal-stripe-connect.js @@ -0,0 +1,21 @@ +import ModalBase from 'ghost-admin/components/modal-base'; +import classic from 'ember-classic-decorator'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {tracked} from '@glimmer/tracking'; + +// TODO: update modals to work fully with Glimmer components +@classic +export default class ModalStripeConnect extends ModalBase { + @service settings; + + @action + setDefaultContentVisibility(value) { + this.settings.set('defaultContentVisibility', value); + } + + @action + setStripeConnectIntegrationTokenSetting(stripeConnectIntegrationToken) { + this.settings.set('stripeConnectIntegrationToken', stripeConnectIntegrationToken); + } +} diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 369417f334..8154b74c1c 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -13,6 +13,7 @@ export default class MembersAccessController extends Controller { @tracked showLeavePortalModal = false; @tracked showLeaveRouteModal = false; @tracked showPortalSettings = false; + @tracked showStripeConnect = false; @tracked product = null; @tracked stripePrices = []; @@ -112,6 +113,16 @@ export default class MembersAccessController extends Controller { } } + openStripeSettings() { + // Open stripe settings here + + } + + @action + closeStripeConnect() { + this.showStripeConnect = false; + } + @action closePortalSettings() { const changedAttributes = this.settings.changedAttributes(); diff --git a/app/styles/layouts/labs.css b/app/styles/layouts/labs.css index 97f75633df..c02ebbf3e6 100644 --- a/app/styles/layouts/labs.css +++ b/app/styles/layouts/labs.css @@ -64,119 +64,6 @@ opacity: 0.25; } - -/* Stripe settings */ - -.gh-members-stripe-info-header { - display: flex; - justify-content: space-between; - align-items: center; -} - -.gh-members-stripe-info-header h4 { - font-weight: 600; - margin: 0; - padding: 0; -} - -.gh-members-stripe-info { - border-radius: 0.9rem; - border: 1px solid var(--whitegrey); - background: var(--white); - padding: 12px; - width: 380px; -} - -.gh-members-stripe-badge { - width: 180px; -} - -.gh-members-stripe-link { - color: #555ABF; -} - -.gh-members-connectbutton-container { - max-width: 380px; -} - -.gh-members-connectbutton-container .for-switch { - line-height: 1em; -} - -.gh-members-connectbutton-container .for-switch label { - width: 36px !important -} - -.gh-members-connectbutton-container .for-switch input:checked + .input-toggle-component { - background: #F1946A; -} - -.gh-members-connect-testmodeon { - color: #F1946A; -} - -.gh-members-stripe-connect-token { - background: var(--whitegrey-l2); - min-height: unset; - height: 73px; - max-width: 380px; - font-family: var(--font-family-mono); - font-size: 1.3rem; - resize: none; -} - -.gh-members-connect-testmodelabel { - display: inline-block; - background: #f8e5b9; - color: #983705; - font-size: 1.2rem; - font-weight: 500; - line-height: 1em; - border-radius: 999px; - padding: 4px 8px; -} - -.gh-members-connect-savecontainer { - height: 0px; - overflow-y: hidden; - transition: all 0.2s ease-in-out; - opacity: 0; - margin-top: 16px; - margin-bottom: 0; -} - -.gh-members-connect-savecontainer.expanded { - margin-bottom: 20px; -} - -.gh-members-connect-savecontainer.expanded { - height: 36px; - opacity: 1.0; -} - -@media (max-width: 500px) { - .gh-members-stripe-info-header { - flex-direction: column; - align-items: stretch; - } - - .gh-members-stripe-info-header h4 { - order: 2; - margin-top: 10px; - padding-top: 10px; - border-top: 1px solid var(--whitegrey); - } - - .gh-members-stripe-badge { - order: 1; - /* margin: -10px 0 0 -10px; */ - } - - .gh-members-stripe-info { - width: 100%; - } -} - .gh-labs-members-emaildropdown { min-width: 208px; margin-left: 8px; diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 38fcfb5187..e9171d9855 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1427,7 +1427,7 @@ p.theme-validation-details { } .gh-setting-members-tierscontainer { - margin-top: 3vmin; + margin-top: 7vmin; } .gh-settings-members-tiersheader { @@ -1506,6 +1506,182 @@ p.theme-validation-details { ; width: 420px; height: 582px; - margin-bottom: 60px; + margin-bottom: 32px; border-radius: 5px; } + +/* Stripe Connect modal */ +.fullscreen-modal-stripe-connect { + max-width: 860px; +} + +.fullscreen-modal-stripe-connected { + max-width: 440px; +} + +.fullscreen-modal-stripe-connect .gh-main-section { + margin: 0 0 -32px; +} + +.fullscreen-modal-stripe-connected .gh-main-section { + margin-bottom: -20px; +} + +.gh-members-stripe-info-header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.gh-members-stripe-info-header h4 { + font-weight: 600; + margin: 0; + padding: 0; + color: #555ABF; +} + +.gh-members-stripe-info { + border-radius: 0.9rem; + background: color-mod(#555ABF a(12%)); + padding: 12px; + width: 380px; + color: #555ABF; +} + +.gh-members-stripe-badge { + width: 180px; +} + +.gh-members-stripe-link, +.gh-members-stripe-link:hover { + color: #555ABF; + text-decoration: underline; +} + +.gh-members-connectbutton-container { + max-width: 380px; +} + +.gh-members-connectbutton-container .for-switch { + line-height: 1em; +} + +.gh-members-connectbutton-container .for-switch label { + width: 36px !important +} + +.gh-members-connectbutton-container .for-switch input:checked + .input-toggle-component { + background: #F1946A; +} + +.gh-members-connect-testmodeon { + color: #F1946A; +} + +.gh-members-stripe-connect-token { + background: var(--whitegrey-l2); + min-height: unset; + height: 80px; + max-width: 380px; + font-family: var(--font-family-mono); + font-size: 1.3rem; + resize: none; +} + +.gh-members-connect-testmodelabel { + display: inline-block; + background: #f8e5b9; + color: #983705; + font-size: 1.2rem; + font-weight: 500; + line-height: 1em; + border-radius: 999px; + padding: 4px 8px; +} + +.gh-members-connect-savecontainer { + height: 0px; + overflow-y: hidden; + transition: all 0.2s ease-in-out; + opacity: 0; + margin-top: 16px; + margin-bottom: 0; +} + +.gh-members-connect-savecontainer.expanded { + margin-bottom: 20px; +} + +.gh-members-connect-savecontainer.expanded { + height: 36px; + opacity: 1.0; +} + +.gh-stripe-connected-container { + display: flex; + flex-direction: column; + align-items: center; +} + +.gh-stripe-connected-container .check-circle { + width: 60px; + height: 60px; + color: var(--green); + margin-top: 20px; +} + +.gh-stripe-connected-container .check-circle path { + stroke-width: 1px; +} + +.gh-stripe-connected-container h1 { + font-size: 2.1rem; + font-weight: 600; + letter-spacing: -.1px; + margin: 20px 0 4px; +} + +.gh-stripe-connected-info { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + margin-bottom: 32px; +} + +.gh-stripe-connected-info p { + margin-bottom: 8px; +} + +.gh-btn-stripe-disconnect { + align-self: flex-start; + margin-bottom: -34px; +} + +.gh-stripe-error-hasactivesub { + margin: 24px 24px -8px; + color: var(--red); +} + +@media (max-width: 500px) { + .gh-members-stripe-info-header { + flex-direction: column; + align-items: stretch; + } + + .gh-members-stripe-info-header h4 { + order: 2; + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid var(--whitegrey); + } + + .gh-members-stripe-badge { + order: 1; + /* margin: -10px 0 0 -10px; */ + } + + .gh-members-stripe-info { + width: 100%; + } +} diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 2adcdd7b65..a222d724bc 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -56,8 +56,10 @@

    Membership tiers

    -
    @@ -100,7 +102,14 @@

    Premium

    Customise prices and premium signup options

    - + + {{#if this.settings.stripeConnectAccountId}} + + {{else}} + + {{/if}}
    {{#liquid-if this.paidOpen}} @@ -207,4 +216,11 @@ @modifier="action wide" /> {{/if}} + + {{#if this.showStripeConnect}} + + {{/if}} \ No newline at end of file diff --git a/public/assets/icons/check-circle-stroke.svg b/public/assets/icons/check-circle-stroke.svg new file mode 100644 index 0000000000..891ab2c7a4 --- /dev/null +++ b/public/assets/icons/check-circle-stroke.svg @@ -0,0 +1 @@ +check-circle \ No newline at end of file From 3c5109067d446dabd49c72d16019e075cd6f8c7e Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 17 May 2021 17:39:41 +0200 Subject: [PATCH 0293/3032] Fix tests --- app/components/modal-stripe-connect.js | 1 - app/controllers/settings/membership.js | 5 ----- 2 files changed, 6 deletions(-) diff --git a/app/components/modal-stripe-connect.js b/app/components/modal-stripe-connect.js index 3b8d8c9309..98a47bc352 100644 --- a/app/components/modal-stripe-connect.js +++ b/app/components/modal-stripe-connect.js @@ -2,7 +2,6 @@ import ModalBase from 'ghost-admin/components/modal-base'; import classic from 'ember-classic-decorator'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; -import {tracked} from '@glimmer/tracking'; // TODO: update modals to work fully with Glimmer components @classic diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 8154b74c1c..47cb8e656f 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -113,11 +113,6 @@ export default class MembersAccessController extends Controller { } } - openStripeSettings() { - // Open stripe settings here - - } - @action closeStripeConnect() { this.showStripeConnect = false; From 98ffc8d9b0aebe417972fba1b24e5788a81a88eb Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 17 May 2021 18:12:49 +0200 Subject: [PATCH 0294/3032] Refined currency dropdown --- app/styles/layouts/settings.css | 43 ++++++++++++++++++++++----- app/templates/settings/membership.hbs | 7 +++-- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index e9171d9855..d6392f941f 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1465,26 +1465,53 @@ p.theme-validation-details { margin-bottom: 4px; } +.gh-setting-members-currency { + position: relative; +} + +.gh-setting-members-currencylabel { + position: absolute; + display: flex !important; + align-items: center; + top: 1px; + left: 0px; + background: var(--main-color-content-greybg); + height: 20px; + font-weight: 500; + font-size: 1.4rem; + color: var(--middarkgrey); + text-transform: uppercase; + pointer-events: none; +} + +.gh-setting-members-currencylabel span { + margin-right: 0; +} + +.gh-settings-members-pricelabelcont .gh-select svg { + position: unset; + margin-top: -3px; +} + .gh-settings-members-pricelabelcont .gh-select { padding: 0; - width: 320px; + width: 60px; + height: 16px; background: transparent; border: none; + margin-left: -4px; } .gh-settings-members-pricelabelcont .gh-select select { background: transparent; + font-size: 1.4rem; + font-weight: 500; border: none; + height: 16px; + width: 46px; padding: 0; } -.gh-settings-members-pricelabelcont .gh-select svg { - position: absolute; - bottom: unset; - width: 12px; - margin-right: unset; -} - .gh-setting-members-prices { display: grid; grid-template-columns: 1fr 1fr; diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index a222d724bc..c6b6b58445 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -122,7 +122,11 @@
    - + +
    + {{this.currency}} + {{svg-jar "arrow-down-small"}} +
    - {{svg-jar "arrow-down-small"}}
    From 6bb02984c475e3d9c72838a4bda0d19f5aa8b168 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Mon, 17 May 2021 19:36:36 +0200 Subject: [PATCH 0295/3032] Refined membership access settings --- .../settings/members-default-post-access.hbs | 3 ++- .../settings/members-default-post-access.js | 2 +- .../settings/members-subscription-access.hbs | 3 ++- .../settings/members-subscription-access.js | 2 +- app/styles/components/power-select.css | 7 ++--- app/styles/layouts/settings.css | 27 ++++++++++++++++++- app/templates/settings/membership.hbs | 8 +++--- 7 files changed, 39 insertions(+), 13 deletions(-) diff --git a/app/components/settings/members-default-post-access.hbs b/app/components/settings/members-default-post-access.hbs index 9005c2b299..33ffecfc2b 100644 --- a/app/components/settings/members-default-post-access.hbs +++ b/app/components/settings/members-default-post-access.hbs @@ -12,9 +12,10 @@ @onChange={{this.setDefaultContentVisibility}} @disabled={{eq this.settings.membersSignupAccess "none"}} @triggerClass="gh-setting-dropdown" + @dropdownClass="gh-setting-dropdown-list" as |option| > -
    +
    {{svg-jar option.icon class=(concat "w8 h8 mr2 fill-" (or option.icon_color "green"))}}
    {{option.name}}
    diff --git a/app/components/settings/members-default-post-access.js b/app/components/settings/members-default-post-access.js index 23dfe5c06b..838e00403d 100644 --- a/app/components/settings/members-default-post-access.js +++ b/app/components/settings/members-default-post-access.js @@ -20,7 +20,7 @@ export default class SettingsMembersDefaultPostAccess extends Component { icon_color: 'green' }, { name: 'Paid-members only', - description: 'Only logged-in mmembers with an active Stripe subscription', + description: 'Only logged-in members with an active Stripe subscription', value: 'paid', icon: 'globe', icon_color: 'green' diff --git a/app/components/settings/members-subscription-access.hbs b/app/components/settings/members-subscription-access.hbs index eb5d138f8d..33727e4733 100644 --- a/app/components/settings/members-subscription-access.hbs +++ b/app/components/settings/members-subscription-access.hbs @@ -11,9 +11,10 @@ @selected={{this.selectedOption}} @onChange={{this.setSignupAccess}} @triggerClass="gh-setting-dropdown" + @dropdownClass="gh-setting-dropdown-list" as |option| > -
    +
    {{svg-jar option.icon class=(concat "w8 h8 mr2 fill-" (or option.icon_color "green"))}}
    {{option.name}}
    diff --git a/app/components/settings/members-subscription-access.js b/app/components/settings/members-subscription-access.js index 004e185a00..527493deff 100644 --- a/app/components/settings/members-subscription-access.js +++ b/app/components/settings/members-subscription-access.js @@ -16,7 +16,7 @@ export default class SettingsMembersSubscriptionAccess extends Component { name: 'Only people I invite', description: 'People can sign in from your site but won\'t be able to sign up', value: 'invite', - icon: 'globe', + icon: 'email-love-letter', icon_color: 'green' }, { name: 'Nobody', diff --git a/app/styles/components/power-select.css b/app/styles/components/power-select.css index 1e0102176b..1531d63fc1 100644 --- a/app/styles/components/power-select.css +++ b/app/styles/components/power-select.css @@ -1,12 +1,12 @@ .ember-power-select-trigger { padding: 0 16px 0 8px; - border: 1px solid color-mod(var(--lightgrey) l(-5%) s(-5%)); + border: var(--input-border); border-radius: var(--border-radius); background: transparent; } .ember-power-select-trigger:focus, .ember-power-select-trigger--active { - border: 1px solid color-mod(var(--lightgrey) l(-5%) s(-5%)); + border: var(--input-border); } .ember-power-select-trigger:not(.gh-setting-dropdown) svg { @@ -55,7 +55,8 @@ } .ember-power-select-dropdown.ember-basic-dropdown-content--below { - border-bottom: none; + border: 1px solid var(--input-border-color); + border-top: none; } .ember-power-select-option { diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index d6392f941f..f1140d8959 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1407,6 +1407,7 @@ p.theme-validation-details { } .gh-setting-members-basicsform .intro { + margin: 0 0 2em; font-size: 1.6rem; } @@ -1422,8 +1423,32 @@ p.theme-validation-details { color: var(--midgrey); } +.gh-setting-dropdown { + margin-top: 1.2rem; +} + +.gh-setting-dropdown .gh-setting-dropdown-content { + display: flex; + margin: 1.6rem 1rem; +} + +.gh-setting-dropdown-list .ember-power-select-option { + padding: 6px 8px; +} + +.gh-setting-dropdown-list .gh-setting-dropdown-content { + display: flex; + margin: 1.4rem 1rem; +} + +.gh-setting-dropdown-content svg { + width: 3.2rem; + height: 3.2rem; + margin-right: 1rem; +} + .gh-setting-richdd-container { - margin: 32px 0; + margin: 36px 0; } .gh-setting-members-tierscontainer { diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index c6b6b58445..2e56c4e31c 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -32,11 +32,9 @@ Customize members modal signup flow

    -
    - -
    +
    From cffa141f3ee952a7d3db3b7e027163ff2eaaa36a Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 18 May 2021 13:41:22 +0530 Subject: [PATCH 0296/3032] Wired premium prices in membership settings refs https://github.com/TryGhost/Ghost/commit/4627d1c26afbd7198e49ca99d476de1736472783 - Adds new settings for monthly/yearly price ids in the settings modal - Updates logic to save product on membership settings - Creates new prices for monthly/yearly when it doesn't exist, updates the monthly/yearly price ids in the settings - Fixes selected currency value in dropdown --- app/controllers/settings/membership.js | 83 ++++++++++++++++++++++---- app/models/setting.js | 2 + 2 files changed, 75 insertions(+), 10 deletions(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 47cb8e656f..e78874c504 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -1,10 +1,18 @@ import Controller from '@ember/controller'; import {action} from '@ember/object'; -import {getCurrencyOptions, getSymbol} from 'ghost-admin/utils/currency'; +import {currencies, getCurrencyOptions, getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; import {tracked} from '@glimmer/tracking'; +const CURRENCIES = currencies.map((currency) => { + return { + value: currency.isoCode.toLowerCase(), + label: `${currency.isoCode} - ${currency.name}`, + isoCode: currency.isoCode + }; +}); + export default class MembersAccessController extends Controller { @service settings; @service store; @@ -34,6 +42,10 @@ export default class MembersAccessController extends Controller { this.allCurrencies = getCurrencyOptions(); } + get selectedCurrency() { + return CURRENCIES.findBy('value', this.currency); + } + leaveRoute(transition) { if (this.settings.get('hasDirtyAttributes')) { transition.abort(); @@ -157,19 +169,36 @@ export default class MembersAccessController extends Controller { this.leaveSettingsTransition = null; } - saveProduct() { + async saveProduct() { if (this.product) { const stripePrices = this.product.stripePrices || []; - if (this.stripeMonthlyAmount && this.stripeYearlyAmount) { + const monthlyAmount = this.stripeMonthlyAmount * 100; + const yearlyAmount = this.stripeYearlyAmount * 100; + const getActivePrice = (prices, type, amount) => { + return prices.find((price) => { + return ( + price.active && price.amount === amount && price.type === 'recurring' && + price.interval === type && price.currency.toLowerCase() === this.currency.toLowerCase() + ); + }); + }; + const monthlyPrice = getActivePrice(stripePrices, 'month', monthlyAmount); + const yearlyPrice = getActivePrice(stripePrices, 'year', yearlyAmount); + + if (!monthlyPrice) { stripePrices.push( { nickname: 'Monthly', - amount: this.stripeMonthlyAmount * 100, + amount: monthlyAmount, active: 1, currency: this.currency, interval: 'month', type: 'recurring' - }, + } + ); + } + if (!yearlyPrice) { + stripePrices.push( { nickname: 'Yearly', amount: this.stripeYearlyAmount * 100, @@ -179,23 +208,56 @@ export default class MembersAccessController extends Controller { type: 'recurring' } ); - this.product.set('stripePrices', stripePrices); + } + if (monthlyPrice && yearlyPrice) { + this.settings.set('membersMonthlyPriceId', monthlyPrice.id); + this.settings.set('membersYearlyPriceId', yearlyPrice.id); return this.product; } else { - return this.product; + this.product.set('stripePrices', stripePrices); + const savedProduct = await this.product.save(); + const updatedStripePrices = savedProduct.stripePrices || []; + const updatedMonthlyPrice = getActivePrice(updatedStripePrices, 'month', monthlyAmount); + const updatedYearlyPrice = getActivePrice(updatedStripePrices, 'year', yearlyAmount); + this.settings.set('membersMonthlyPriceId', updatedMonthlyPrice.id); + this.settings.set('membersYearlyPriceId', updatedYearlyPrice.id); + return savedProduct; } } } + getPrice(prices, type) { + const monthlyPriceId = this.settings.get('membersMonthlyPriceId'); + const yearlyPriceId = this.settings.get('membersYearlyPriceId'); + + if (type === 'monthly') { + return ( + prices.find(price => price.id === monthlyPriceId) || + prices.find(price => price.nickname === 'Monthly') || + prices.find(price => price.interval === 'month') + ); + } + + if (type === 'yearly') { + return ( + prices.find(price => price.id === yearlyPriceId) || + prices.find(price => price.nickname === 'Yearly') || + prices.find(price => price.interval === 'year') + ); + } + return null; + } + @task({drop: true}) *fetchDefaultProduct() { const products = yield this.store.query('product', {include: 'stripe_prices'}); this.product = products.firstObject; this.stripePrices = []; if (this.product) { - this.stripePrices = this.product.get('stripePrices'); - const monthlyPrice = this.stripePrices.find(d => d.nickname === 'Monthly'); - const yearlyPrice = this.stripePrices.find(d => d.nickname === 'Yearly'); + this.stripePrices = this.product.get('stripePrices') || []; + const activePrices = this.stripePrices.filter(price => !!price.active); + const monthlyPrice = this.getPrice(activePrices, 'monthly'); + const yearlyPrice = this.getPrice(activePrices, 'yearly'); if (monthlyPrice && monthlyPrice.amount) { this.stripeMonthlyAmount = (monthlyPrice.amount / 100); this.currency = monthlyPrice.currency; @@ -217,6 +279,7 @@ export default class MembersAccessController extends Controller { if (this.settings.get('errors').length !== 0) { return; } + yield this.saveProduct(); return yield this.settings.save(); } diff --git a/app/models/setting.js b/app/models/setting.js index 70763de394..0fe9cc2dfd 100644 --- a/app/models/setting.js +++ b/app/models/setting.js @@ -61,6 +61,8 @@ export default Model.extend(ValidationEngine, { membersFreeSignupRedirect: attr('string'), membersFreePriceName: attr('string'), membersFreePriceDescription: attr('string'), + membersMonthlyPriceId: attr('string'), + membersYearlyPriceId: attr('string'), stripeProductName: attr('string'), stripeSecretKey: attr('string'), stripePublishableKey: attr('string'), From 7b2949c65d30821fcb8cdac26ed03b7c1ea78ed3 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Tue, 18 May 2021 11:09:42 +0200 Subject: [PATCH 0297/3032] Minor spacing refinements on Membership settings --- app/styles/layouts/settings.css | 15 ++++++++--- app/templates/settings/membership.hbs | 36 ++++++++++++++------------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index f1140d8959..5d54765a6c 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1406,8 +1406,14 @@ p.theme-validation-details { grid-gap: 32px; } +.gh-setting-members-basicsform { + display: flex; + flex-direction: column; + justify-content: space-between; +} + .gh-setting-members-basicsform .intro { - margin: 0 0 2em; + margin: 0; font-size: 1.6rem; } @@ -1415,8 +1421,11 @@ p.theme-validation-details { background: linear-gradient(to left, color-mod(var(--main-color-content-greybg) l(-3%)), var(--main-color-content-greybg)); } +.gh-setting-members-access { + margin-bottom: 30px; +} + .gh-setting-members-portalpreview { - flex-basis: 460px; justify-self: end; font-size: 1.3rem; font-weight: 500; @@ -1452,7 +1461,7 @@ p.theme-validation-details { } .gh-setting-members-tierscontainer { - margin-top: 7vmin; + margin-top: 4vmin; } .gh-settings-members-tiersheader { diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 2e56c4e31c..e762f879f4 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -22,26 +22,28 @@

    Fund your work with subscription revenue. Connect your Stripe account and offer premium content to your audience. Our creators are already making over $2 million per year, while Ghost takes 0% payment fees.

    - -
    -
    -
    -
    -

    Portal Settings

    -

    - Customize members modal signup flow -

    +
    +
    +
    +
    +
    +
    +

    Portal Settings

    +

    + Customize members modal signup flow +

    +
    +
    -
    -
    -
    + -
    - - +
    + + +
    From bfb5192f9f046f410bb7c5aa1ff5fa07866a894e Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Tue, 18 May 2021 11:42:16 +0200 Subject: [PATCH 0298/3032] Copy update on Member details --- app/components/gh-member-settings-form-cp.hbs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index 62e7612a60..38e7aca033 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -107,10 +107,10 @@ {{#unless this.products}}
    -
    This member doesn't have any subscriptions.
    +
    This member doesn't have subscriptions.
    {{#unless this.member.isNew}} {{/unless}}
    @@ -180,7 +180,7 @@
    From 447719f14883b6971ae0c6a969225ef519eeb02c Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Tue, 18 May 2021 14:15:44 +0200 Subject: [PATCH 0299/3032] Updated launch wizard Stripe connect info styles --- app/components/gh-launch-wizard/connect-stripe.hbs | 10 +++++----- app/styles/layouts/fullscreen-wizard.css | 4 +--- app/styles/layouts/settings.css | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/app/components/gh-launch-wizard/connect-stripe.hbs b/app/components/gh-launch-wizard/connect-stripe.hbs index 9253b18ff8..739ef0847b 100644 --- a/app/components/gh-launch-wizard/connect-stripe.hbs +++ b/app/components/gh-launch-wizard/connect-stripe.hbs @@ -1,14 +1,14 @@
    -
    -
    -
    How you get paid
    +
    +
    +

    Getting paid

    {{svg-jar "stripe-verified-partner-badge" class="gh-members-stripe-badge"}}
    -
    +

    Stripe is our exclusive direct payments partner. Ghost collects no fees on any payments! If you don’t have a Stripe account yet, you can sign up here. -

    +

    {{#if this.config.stripeDirect}} diff --git a/app/styles/layouts/fullscreen-wizard.css b/app/styles/layouts/fullscreen-wizard.css index 8518d44a5e..f888d8673c 100644 --- a/app/styles/layouts/fullscreen-wizard.css +++ b/app/styles/layouts/fullscreen-wizard.css @@ -89,9 +89,7 @@ /* Connect Stripe settings */ .gh-launch-wizard-stripe-info { width: 100%; - padding: 24px 16px; - background: var(--whitegrey-l1); - border-radius: 2px; + padding: 16px; } .gh-launch-wizard-stripe-connect-token { diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 5d54765a6c..52e119fd6b 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1620,7 +1620,7 @@ p.theme-validation-details { } .gh-members-connectbutton-container { - max-width: 380px; + margin-right: 4px; } .gh-members-connectbutton-container .for-switch { From 3aca7182f37d00a3873318355ee0028d03ac69a0 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 18 May 2021 13:59:47 +0100 Subject: [PATCH 0300/3032] Added portal preview to memberships screen no issue - fixed styling issues - fixed portal preview taking over the screen by adding `position: relative` to the container - fixed portal preview being interactive by disabling pointer events - added portal preview URL generation to memberships controller - moved much of the preview params knowledge/calculations from the `` component into the `members-utils` service so that a portal preview URL can be generated from anywhere using current settings values rather than the method consumer needing to have knowledge of all params and how to generate them - updated actions in controller that modify settings to also update the preview url - added `onChange` event to the `` component so the controller can react and update preview - used `` with generated portal preview URL for live display of portal changes on memberships screen --- app/components/modal-portal-settings.hbs | 16 ++-- app/components/modal-portal-settings.js | 79 ++++------------- .../settings/members-subscription-access.js | 1 + app/controllers/settings/membership.js | 44 +++++++--- app/services/members-utils.js | 85 +++++++++++++++---- app/styles/layouts/settings.css | 2 + app/templates/settings/membership.hbs | 15 +++- 7 files changed, 136 insertions(+), 106 deletions(-) diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index 104d0354ab..5b83db413a 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -29,7 +29,7 @@
    - {{#if this.isStripeConfigured}} + {{#if this.membersUtils.isStripeEnabled}}

    Prices available at signup

    @@ -41,10 +41,10 @@ >
    - {{#each this.defaultButtonIcons as |imgIcon| }} - + {{#each this.membersUtils.defaultButtonIcons as |imgIcon| }} + {{svg-jar imgIcon.icon}} {{/each}} @@ -151,13 +151,13 @@
    {{else if this.customIcon}} icon - {{#if (eq this.buttonIcon this.customIcon)}} + {{#if (eq this.membersUtils.buttonIcon this.customIcon)}} diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index 5c4c50108d..bbe59738cb 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -3,35 +3,11 @@ import ModalComponent from 'ghost-admin/components/modal-base'; import copyTextToClipboard from 'ghost-admin/utils/copy-text-to-clipboard'; import {computed} from '@ember/object'; import {htmlSafe} from '@ember/template'; -import {reads} from '@ember/object/computed'; import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; import {task, timeout} from 'ember-concurrency'; const ICON_EXTENSIONS = ['gif', 'jpg', 'jpeg', 'png', 'svg']; -export const ICON_MAPPING = [ - { - icon: 'portal-icon-1', - value: 'icon-1' - }, - { - icon: 'portal-icon-2', - value: 'icon-2' - }, - { - icon: 'portal-icon-3', - value: 'icon-3' - }, - { - icon: 'portal-icon-4', - value: 'icon-4' - }, - { - icon: 'portal-icon-5', - value: 'icon-5' - } -]; - export default ModalComponent.extend({ config: service(), membersUtils: service(), @@ -40,7 +16,6 @@ export default ModalComponent.extend({ page: 'signup', iconExtensions: null, - defaultButtonIcons: null, isShowModalLink: true, customIcon: null, showLinksPage: false, @@ -51,10 +26,8 @@ export default ModalComponent.extend({ confirm() {}, - isStripeConfigured: reads('membersUtils.isStripeEnabled'), - filteredPrices: computed('prices', 'settings.portalPlans.[]', function () { - const portalPlans = this.get('settings.portalPlans'); + const portalPlans = this.settings.get('portalPlans'); const prices = this.prices || []; return prices.filter((d) => { return d.amount !== 0 && d.type === 'recurring'; @@ -67,7 +40,7 @@ export default ModalComponent.extend({ }), hasPaidPriceChecked: computed('prices', 'settings.portalPlans.[]', function () { - const portalPlans = this.get('settings.portalPlans'); + const portalPlans = this.settings.get('portalPlans'); const prices = this.prices || []; return prices.filter((d) => { return d.amount !== 0 && d.type === 'recurring'; @@ -76,13 +49,8 @@ export default ModalComponent.extend({ }); }), - buttonIcon: computed('settings.portalButtonIcon', function () { - const defaultIconKeys = this.defaultButtonIcons.map(buttonIcon => buttonIcon.value); - return (this.settings.get('portalButtonIcon') || defaultIconKeys[0]); - }), - backgroundStyle: computed('settings.accentColor', function () { - let color = this.get('settings.accentColor') || '#ffffff'; + let color = this.settings.get('accentColor') || '#ffffff'; return htmlSafe(`background-color: ${color}`); }), @@ -93,9 +61,8 @@ export default ModalComponent.extend({ return `data-portal`; }), - portalPreviewUrl: computed('buttonIcon', 'page', 'isFreeChecked', 'isMonthlyChecked', 'isYearlyChecked', 'settings.{portalName,portalButton,portalButtonSignupText,portalButtonStyle,accentColor,portalPlans.[]}', function () { - const options = this.getProperties(['buttonIcon', 'page', 'isFreeChecked', 'isMonthlyChecked', 'isYearlyChecked']); - options.portalPlans = this.get('settings.portalPlans'); + portalPreviewUrl: computed('page', 'membersUtils.{isFreeChecked,isMonthlyChecked,isYearlyChecked}', 'settings.{portalName,portalButton,portalButtonIcon,portalButtonSignupText,portalButtonStyle,accentColor,portalPlans.[]}', function () { + const options = this.getProperties(['page']); return this.membersUtils.getPortalPreviewUrl(options); }), @@ -109,21 +76,6 @@ export default ModalComponent.extend({ return selectedButtonStyle.includes('text'); }), - isFreeChecked: computed('settings.{portalPlans.[],membersSignupAccess}', function () { - const allowedPlans = this.settings.get('portalPlans') || []; - return (this.settings.get('membersSignupAccess') === 'all' && allowedPlans.includes('free')); - }), - - isMonthlyChecked: computed('settings.portalPlans.[]', 'isStripeConfigured', function () { - const allowedPlans = this.settings.get('portalPlans') || []; - return (this.isStripeConfigured && allowedPlans.includes('monthly')); - }), - - isYearlyChecked: computed('settings.portalPlans.[]', 'isStripeConfigured', function () { - const allowedPlans = this.settings.get('portalPlans') || []; - return (this.isStripeConfigured && allowedPlans.includes('yearly')); - }), - selectedButtonStyle: computed('settings.portalButtonStyle', function () { return this.buttonStyleOptions.find((buttonStyle) => { return (buttonStyle.name === this.settings.get('portalButtonStyle')); @@ -138,20 +90,20 @@ export default ModalComponent.extend({ {name: 'icon-only', label: 'Icon only'}, {name: 'text-only', label: 'Text only'} ]; - this.defaultButtonIcons = ICON_MAPPING; this.iconExtensions = ICON_EXTENSIONS; + const portalButtonIcon = this.settings.get('portalButtonIcon') || ''; - const defaultIconKeys = this.defaultButtonIcons.map(buttonIcon => buttonIcon.value); - if (portalButtonIcon && !defaultIconKeys.includes(portalButtonIcon)) { + if (portalButtonIcon && !this.membersUtils.defaultIconKeys.includes(portalButtonIcon)) { this.set('customIcon', this.settings.get('portalButtonIcon')); } + this.getAvailablePrices.perform(); this.siteUrl = this.config.get('blogUrl'); }, didInsertElement() { this._super(...arguments); - this.get('settings.errors').clear(); + this.settings.get('errors').clear(); run.later(this, function () { if (!this.isDestroyed && !this.isDestroying) { this.set('hidePreviewFrame', false); @@ -249,8 +201,7 @@ export default ModalComponent.extend({ deleteCustomIcon() { this.set('customIcon', null); - const defaultIconKeys = ICON_MAPPING.map(buttonIcon => buttonIcon.value); - this.settings.set('portalButtonIcon', defaultIconKeys[0]); + this.settings.set('portalButtonIcon', this.membersUtils.defaultIconKeys[0]); }, selectDefaultIcon(icon) { @@ -293,12 +244,12 @@ export default ModalComponent.extend({ _validateSignupRedirect(url, type) { let errMessage = `Please enter a valid URL`; - this.get('settings.errors').remove(type); - this.get('settings.hasValidated').removeObject(type); + this.settings.get('errors').remove(type); + this.settings.get('hasValidated').removeObject(type); if (url === null) { - this.get('settings.errors').add(type, errMessage); - this.get('settings.hasValidated').pushObject(type); + this.settings.get('errors').add(type, errMessage); + this.settings.get('hasValidated').pushObject(type); return false; } @@ -323,7 +274,7 @@ export default ModalComponent.extend({ saveTask: task(function* () { this.send('validateFreeSignupRedirect'); this.send('validatePaidSignupRedirect'); - if (this.get('settings.errors').length !== 0) { + if (this.settings.get('errors').length !== 0) { return; } yield this.settings.save(); diff --git a/app/components/settings/members-subscription-access.js b/app/components/settings/members-subscription-access.js index 527493deff..112830f57c 100644 --- a/app/components/settings/members-subscription-access.js +++ b/app/components/settings/members-subscription-access.js @@ -34,6 +34,7 @@ export default class SettingsMembersSubscriptionAccess extends Component { @action setSignupAccess(option) { this.settings.set('membersSignupAccess', option.value); + this.args.onChange?.(option.value); if (option.value === 'none') { this.settings.set('defaultContentVisibility', 'public'); diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index e78874c504..38acce0042 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -14,9 +14,10 @@ const CURRENCIES = currencies.map((currency) => { }); export default class MembersAccessController extends Controller { + @service config; + @service membersUtils; @service settings; @service store; - @service config; @tracked showLeavePortalModal = false; @tracked showLeaveRouteModal = false; @@ -32,6 +33,8 @@ export default class MembersAccessController extends Controller { @tracked currency = 'usd'; @tracked stripePlanError = ''; + @tracked portalPreviewUrl = ''; + queryParams = ['showPortalSettings']; constructor(...args) { @@ -78,11 +81,6 @@ export default class MembersAccessController extends Controller { } } - @action openPortalSettings() { - this.saveSettingsTask.perform(); - this.showPortalSettings = true; - } - @action setStripePlansCurrency(event) { const newCurrency = event.value; @@ -120,6 +118,8 @@ export default class MembersAccessController extends Controller { if (!yearlyAmount || yearlyAmount < 1 || !monthlyAmount || monthlyAmount < 1) { throw new TypeError(`Subscription amount must be at least ${symbol}1.00`); } + + this.updatePortalPreview(); } catch (err) { this.stripePlanError = err.message; } @@ -130,6 +130,12 @@ export default class MembersAccessController extends Controller { this.showStripeConnect = false; } + @action + openPortalSettings() { + this.saveSettingsTask.perform(); + this.showPortalSettings = true; + } + @action closePortalSettings() { const changedAttributes = this.settings.changedAttributes(); @@ -137,6 +143,7 @@ export default class MembersAccessController extends Controller { this.showLeavePortalModal = true; } else { this.showPortalSettings = false; + this.updatePortalPreview(); } } @@ -145,6 +152,7 @@ export default class MembersAccessController extends Controller { this.settings.rollbackAttributes(); this.showPortalSettings = false; this.showLeavePortalModal = false; + this.updatePortalPreview(); } @action @@ -152,11 +160,6 @@ export default class MembersAccessController extends Controller { this.showLeavePortalModal = false; } - @action - openStripeSettings() { - // Open stripe settings here - } - @action async confirmLeave() { this.settings.rollbackAttributes(); @@ -169,6 +172,18 @@ export default class MembersAccessController extends Controller { this.leaveSettingsTransition = null; } + @action + updatePortalPreview() { + // TODO: can these be worked out from settings in membersUtils? + const monthlyPrice = this.stripeMonthlyAmount; + const yearlyPrice = this.stripeYearlyAmount; + + this.portalPreviewUrl = this.membersUtils.getPortalPreviewUrl({ + monthlyPrice, + yearlyPrice + }); + } + async saveProduct() { if (this.product) { const stripePrices = this.product.stripePrices || []; @@ -279,8 +294,13 @@ export default class MembersAccessController extends Controller { if (this.settings.get('errors').length !== 0) { return; } + yield this.saveProduct(); - return yield this.settings.save(); + const result = yield this.settings.save(); + + this.updatePortalPreview(); + + return result; } reset() { diff --git a/app/services/members-utils.js b/app/services/members-utils.js index c47ce3dca3..d870e74643 100644 --- a/app/services/members-utils.js +++ b/app/services/members-utils.js @@ -1,5 +1,4 @@ import Service from '@ember/service'; -import {ICON_MAPPING} from 'ghost-admin/components/modal-portal-settings'; import {inject as service} from '@ember/service'; export default class MembersUtilsService extends Service { @service config; @@ -18,31 +17,80 @@ export default class MembersUtilsService extends Service { return hasConnectKeys || hasDirectKeys; } - getPortalPreviewUrl(args) { - let { - disableBackground, - buttonIcon, + // Button / Icon helpers --------------------------------------------------- + + get defaultButtonIcons() { + return [ + { + icon: 'portal-icon-1', + value: 'icon-1' + }, + { + icon: 'portal-icon-2', + value: 'icon-2' + }, + { + icon: 'portal-icon-3', + value: 'icon-3' + }, + { + icon: 'portal-icon-4', + value: 'icon-4' + }, + { + icon: 'portal-icon-5', + value: 'icon-5' + } + ]; + } + + get defaultIconKeys() { + return this.defaultButtonIcons.map(buttonIcon => buttonIcon.value); + } + + get buttonIcon() { + return this.settings.get('portalButtonIcon') || this.defaultIconKeys[0]; + } + + // Plan helpers ------------------------------------------------------------ + + get isFreeChecked() { + const allowedPlans = this.settings.get('portalPlans') || []; + return !!(this.settings.get('membersSignupAccess') === 'all' && allowedPlans.includes('free')); + } + + get isMonthlyChecked() { + const allowedPlans = this.settings.get('portalPlans') || []; + return !!(this.isStripeConfigured && allowedPlans.includes('monthly')); + } + + get isYearlyChecked() { + const allowedPlans = this.settings.get('portalPlans') || []; + return !!(this.isStripeConfigured && allowedPlans.includes('yearly')); + } + + // Portal preview ---------------------------------------------------------- + + getPortalPreviewUrl(overrides) { + const { + disableBackground = false, page = 'signup', - isFreeChecked = true, - isMonthlyChecked = true, - isYearlyChecked = true, + buttonIcon = this.buttonIcon, + isFreeChecked = this.isFreeChecked, + isMonthlyChecked = this.isMonthlyChecked, + isYearlyChecked = this.isYearlyChecked, monthlyPrice, yearlyPrice, - portalPlans, - currency - } = args; - - if (!buttonIcon) { - const defaultIconKeys = ICON_MAPPING.map(icon => icon.value); - buttonIcon = this.settings.get('portalButtonIcon') || defaultIconKeys[0]; - } + portalPlans = this.settings.get('portalPlans'), + currency, + membersSignupAccess = this.settings.get('membersSignupAccess') + } = overrides; const baseUrl = this.config.get('blogUrl'); const portalBase = '/#/portal/preview'; const settingsParam = new URLSearchParams(); const signupButtonText = this.settings.get('portalButtonSignupText') || ''; - const allowSelfSignup = this.settings.get('membersSignupAccess') === 'all' && - (!this.isStripeEnabled || isFreeChecked); + const allowSelfSignup = membersSignupAccess === 'all' && (!this.isStripeEnabled || isFreeChecked); settingsParam.append('button', this.settings.get('portalButton')); settingsParam.append('name', this.settings.get('portalName')); @@ -52,6 +100,7 @@ export default class MembersUtilsService extends Service { settingsParam.append('page', page); settingsParam.append('buttonIcon', encodeURIComponent(buttonIcon)); settingsParam.append('signupButtonText', encodeURIComponent(signupButtonText)); + settingsParam.append('membersSignupAccess', membersSignupAccess); settingsParam.append('allowSelfSignup', allowSelfSignup); if (portalPlans) { diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 52e119fd6b..9e46542a3c 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1554,6 +1554,7 @@ p.theme-validation-details { .gh-setting-members-portal-mock { display: flex; + position: relative; align-items: center; justify-content: center; background: #fff; @@ -1569,6 +1570,7 @@ p.theme-validation-details { height: 582px; margin-bottom: 32px; border-radius: 5px; + pointer-events: none; } /* Stripe Connect modal */ diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index e762f879f4..3c21e07860 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -1,4 +1,4 @@ -
    +

    Settings @@ -41,14 +41,21 @@

    - +
    - PORTAL PREVIEW + {{#if (eq this.settings.membersSignupAccess 'none')}} + PORTAL DISABLED + {{else}} + + {{/if}}
    @@ -219,7 +226,7 @@ @modifier="action wide" /> {{/if}} - + {{#if this.showStripeConnect}} Date: Tue, 18 May 2021 15:10:42 +0200 Subject: [PATCH 0301/3032] Updated access settings dropdowns and icons --- .../settings/members-default-post-access.js | 8 ++++---- .../settings/members-subscription-access.js | 6 +++--- app/styles/layouts/settings.css | 14 +++++++++++--- public/assets/icons/members-all.svg | 5 +++++ public/assets/icons/members-paid.svg | 4 ++++ public/assets/icons/no-members.svg | 3 +++ 6 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 public/assets/icons/members-all.svg create mode 100644 public/assets/icons/members-paid.svg create mode 100644 public/assets/icons/no-members.svg diff --git a/app/components/settings/members-default-post-access.js b/app/components/settings/members-default-post-access.js index 838e00403d..b2513911cd 100644 --- a/app/components/settings/members-default-post-access.js +++ b/app/components/settings/members-default-post-access.js @@ -16,14 +16,14 @@ export default class SettingsMembersDefaultPostAccess extends Component { name: 'Members only', description: 'All logged-in members', value: 'members', - icon: 'globe', - icon_color: 'green' + icon: 'members-all', + icon_color: 'blue' }, { name: 'Paid-members only', description: 'Only logged-in members with an active Stripe subscription', value: 'paid', - icon: 'globe', - icon_color: 'green' + icon: 'members-paid', + icon_color: 'pink' }]; } diff --git a/app/components/settings/members-subscription-access.js b/app/components/settings/members-subscription-access.js index 112830f57c..fad6a33f34 100644 --- a/app/components/settings/members-subscription-access.js +++ b/app/components/settings/members-subscription-access.js @@ -17,13 +17,13 @@ export default class SettingsMembersSubscriptionAccess extends Component { description: 'People can sign in from your site but won\'t be able to sign up', value: 'invite', icon: 'email-love-letter', - icon_color: 'green' + icon_color: 'blue' }, { name: 'Nobody', description: 'No one will be able to subscribe or sign in', value: 'none', - icon: 'globe', - icon_color: 'green' + icon: 'no-members', + icon_color: 'pink' }]; } diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 9e46542a3c..482b8da79e 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1434,10 +1434,17 @@ p.theme-validation-details { .gh-setting-dropdown { margin-top: 1.2rem; + cursor: pointer; + background: var(--white); +} + +.gh-setting-dropdown .ember-power-select-status-icon { + right: 24px; } .gh-setting-dropdown .gh-setting-dropdown-content { display: flex; + align-items: center; margin: 1.6rem 1rem; } @@ -1447,13 +1454,14 @@ p.theme-validation-details { .gh-setting-dropdown-list .gh-setting-dropdown-content { display: flex; + align-items: center; margin: 1.4rem 1rem; } .gh-setting-dropdown-content svg { - width: 3.2rem; - height: 3.2rem; - margin-right: 1rem; + width: 3rem; + height: 3rem; + margin-right: 1.2rem; } .gh-setting-richdd-container { diff --git a/public/assets/icons/members-all.svg b/public/assets/icons/members-all.svg new file mode 100644 index 0000000000..310d8f1dc3 --- /dev/null +++ b/public/assets/icons/members-all.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/icons/members-paid.svg b/public/assets/icons/members-paid.svg new file mode 100644 index 0000000000..bcf6875307 --- /dev/null +++ b/public/assets/icons/members-paid.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/icons/no-members.svg b/public/assets/icons/no-members.svg new file mode 100644 index 0000000000..79523f4d2b --- /dev/null +++ b/public/assets/icons/no-members.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 239dcc765e0b9d765a0d7134a3299e650d3e7aa4 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 18 May 2021 14:34:46 +0100 Subject: [PATCH 0302/3032] Hid button in memberships portal preview no issue - added button override to `getPortalPreviewUrl()` and set it to `false` when generating preview URL for memberships preview --- app/controllers/settings/membership.js | 1 + app/services/members-utils.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 38acce0042..0033626031 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -179,6 +179,7 @@ export default class MembersAccessController extends Controller { const yearlyPrice = this.stripeYearlyAmount; this.portalPreviewUrl = this.membersUtils.getPortalPreviewUrl({ + button: false, monthlyPrice, yearlyPrice }); diff --git a/app/services/members-utils.js b/app/services/members-utils.js index d870e74643..a8b2734bfb 100644 --- a/app/services/members-utils.js +++ b/app/services/members-utils.js @@ -75,6 +75,7 @@ export default class MembersUtilsService extends Service { const { disableBackground = false, page = 'signup', + button = this.settings.get('portalButton'), buttonIcon = this.buttonIcon, isFreeChecked = this.isFreeChecked, isMonthlyChecked = this.isMonthlyChecked, @@ -92,7 +93,7 @@ export default class MembersUtilsService extends Service { const signupButtonText = this.settings.get('portalButtonSignupText') || ''; const allowSelfSignup = membersSignupAccess === 'all' && (!this.isStripeEnabled || isFreeChecked); - settingsParam.append('button', this.settings.get('portalButton')); + settingsParam.append('button', button); settingsParam.append('name', this.settings.get('portalName')); settingsParam.append('isFree', isFreeChecked); settingsParam.append('isMonthly', isMonthlyChecked); From 56a2e1fc1cdc6d9614aaf0ac6ce8ae44500d5301 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 18 May 2021 19:12:37 +0530 Subject: [PATCH 0303/3032] Fixed active prices not read from settings no refs Previously, we were fetching product and prices in the constructor of the controller which did not guarantee settings were updated when picking active prices from the price list. This updates the setup to use `did-insert` modifier to correctly fetch and populate product/price data. --- app/controllers/settings/membership.js | 20 +++++++++++++------- app/templates/settings/membership.hbs | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 0033626031..2a1db21049 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -37,12 +37,12 @@ export default class MembersAccessController extends Controller { queryParams = ['showPortalSettings']; - constructor(...args) { - super(...args); - this.siteUrl = this.config.get('blogUrl'); - this.fetchDefaultProduct.perform(); + get allCurrencies() { + return getCurrencyOptions(); + } - this.allCurrencies = getCurrencyOptions(); + get siteUrl() { + return this.config.get('blogUrl'); } get selectedCurrency() { @@ -58,6 +58,7 @@ export default class MembersAccessController extends Controller { } _validateSignupRedirect(url, type) { + const siteUrl = this.config.get('blogUrl'); let errMessage = `Please enter a valid URL`; this.settings.get('errors').remove(type); this.settings.get('hasValidated').removeObject(type); @@ -73,8 +74,8 @@ export default class MembersAccessController extends Controller { return; } - if (url.href.startsWith(this.siteUrl)) { - const path = url.href.replace(this.siteUrl, ''); + if (url.href.startsWith(siteUrl)) { + const path = url.href.replace(siteUrl, ''); this.settings.set(type, path); } else { this.settings.set(type, url.href); @@ -185,6 +186,11 @@ export default class MembersAccessController extends Controller { }); } + setup() { + this.fetchDefaultProduct.perform(); + this.updatePortalPreview(); + } + async saveProduct() { if (this.product) { const stripePrices = this.product.stripePrices || []; diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 3c21e07860..319c480747 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -1,4 +1,4 @@ -
    +

    Settings From a329b815678b2a67a6a4d99f5d4a81437dd30c84 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 18 May 2021 19:26:50 +0530 Subject: [PATCH 0304/3032] Added missing action modifier on memberships setup no refs Last commit missed the `action` modifier for setup method used in memberships screen insert. --- app/controllers/settings/membership.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 2a1db21049..71f92ed5eb 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -186,6 +186,7 @@ export default class MembersAccessController extends Controller { }); } + @action setup() { this.fetchDefaultProduct.perform(); this.updatePortalPreview(); From 6581d78df8c000ab38935b585a9d2972560b1d46 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Tue, 18 May 2021 15:59:32 +0200 Subject: [PATCH 0305/3032] Fixed responsive issues for membership settings --- .../settings/members-default-post-access.hbs | 2 +- app/styles/layouts/settings.css | 42 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/app/components/settings/members-default-post-access.hbs b/app/components/settings/members-default-post-access.hbs index 33ffecfc2b..d4a335aa9f 100644 --- a/app/components/settings/members-default-post-access.hbs +++ b/app/components/settings/members-default-post-access.hbs @@ -2,7 +2,7 @@

    Default post access

    -

    When a new post is created, who should have access to it?

    +

    When a new post is created, who should have access?

    diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 482b8da79e..2a37c307c5 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1400,12 +1400,30 @@ p.theme-validation-details { opacity: 0.5; } +@media (max-width: 1140px) { + .gh-setting-members-canvas::before { + display: none; + } +} + .gh-setting-members-basics { display: grid; grid-template-columns: auto 460px; grid-gap: 32px; } +@media (max-width: 1260px) { + .gh-setting-members-basics { + grid-gap: 0; + } +} + +@media (max-width: 1140px) { + .gh-setting-members-basics { + display: flex; + } +} + .gh-setting-members-basicsform { display: flex; flex-direction: column; @@ -1421,6 +1439,22 @@ p.theme-validation-details { background: linear-gradient(to left, color-mod(var(--main-color-content-greybg) l(-3%)), var(--main-color-content-greybg)); } +.gh-setting-members-portalcta .gh-expandable-header button { + margin-left: 16px; +} + +@media (max-width: 500px), (min-width: 1140px) and (max-width: 1260px) { + .gh-setting-members-portalcta .gh-expandable-header { + flex-direction: column; + align-items: inherit; + } + + .gh-setting-members-portalcta .gh-expandable-header button { + margin-top: 1rem; + margin-left: 0; + } +} + .gh-setting-members-access { margin-bottom: 30px; } @@ -1432,6 +1466,12 @@ p.theme-validation-details { color: var(--midgrey); } +@media (max-width: 1140px) { + .gh-setting-members-portalpreview { + display: none; + } +} + .gh-setting-dropdown { margin-top: 1.2rem; cursor: pointer; @@ -1445,7 +1485,7 @@ p.theme-validation-details { .gh-setting-dropdown .gh-setting-dropdown-content { display: flex; align-items: center; - margin: 1.6rem 1rem; + margin: 1.6rem 2.4rem 1.6rem 1rem; } .gh-setting-dropdown-list .ember-power-select-option { From 37acba3f0cfb816feeda4af6f72ac444b03b52a4 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 18 May 2021 20:25:05 +0530 Subject: [PATCH 0306/3032] Filtered active monthly/yearly prices in portal settings no refs We only want to show currently active monthly/yearly prices in Portal and Portal settings based on new settings for price ids, and hide all other prices --- app/components/modal-portal-settings.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index bbe59738cb..35af1eea8c 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -26,10 +26,14 @@ export default ModalComponent.extend({ confirm() {}, - filteredPrices: computed('prices', 'settings.portalPlans.[]', function () { + filteredPrices: computed('prices', 'settings.{portalPlans.[],membersMonthlyPriceId,membersYearlyPriceId}', function () { + const monthlyPriceId = this.settings.get('membersMonthlyPriceId'); + const yearlyPriceId = this.settings.get('membersYearlyPriceId'); const portalPlans = this.settings.get('portalPlans'); const prices = this.prices || []; return prices.filter((d) => { + return [monthlyPriceId, yearlyPriceId].includes(d.id); + }).filter((d) => { return d.amount !== 0 && d.type === 'recurring'; }).map((price) => { return { From d1fe9b084b7bacf324456dc08a25164a0126e518 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 18 May 2021 16:08:03 +0100 Subject: [PATCH 0307/3032] Converted `` to a glimmer component no issue - updated to class syntax and glimmer component behaviour - tidied up and standardised usage of the component --- app/components/gh-site-iframe.hbs | 9 +++++++- app/components/gh-site-iframe.js | 29 +++++++++++------------- app/components/modal-portal-settings.hbs | 4 +--- app/templates/settings/membership.hbs | 5 +--- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/app/components/gh-site-iframe.hbs b/app/components/gh-site-iframe.hbs index 241cdd358d..db1910017f 100644 --- a/app/components/gh-site-iframe.hbs +++ b/app/components/gh-site-iframe.hbs @@ -1 +1,8 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/components/gh-site-iframe.js b/app/components/gh-site-iframe.js index ca535f0cc8..97adf18870 100644 --- a/app/components/gh-site-iframe.js +++ b/app/components/gh-site-iframe.js @@ -1,26 +1,23 @@ -import Component from '@ember/component'; -import {computed} from '@ember/object'; +import Component from '@glimmer/component'; +import {action} from '@ember/object'; import {inject as service} from '@ember/service'; -export default Component.extend({ - config: service(), +export default class GhSiteIframeComponent extends Component { + @service config; - tagName: '', - - srcUrl: computed('src', function () { - return this.src || `${this.config.get('blogUrl')}/`; - }), + get srcUrl() { + return this.args.src || `${this.config.get('blogUrl')}/`; + } - didReceiveAttrs() { + @action + resetSrcAttribute(iframe) { // reset the src attribute each time the guid changes - allows for // a click on the navigation item to reset back to the homepage - if ((this.guid !== this._lastGuid) || (this.src !== this._lastSrc)) { - let iframe = document.querySelector('#site-frame'); + if (this.args.guid !== this._lastGuid) { if (iframe) { - iframe.src = this.src || `${this.config.get('blogUrl')}/`; + iframe.src = this.srcUrl; } } - this._lastGuid = this.guid; - this._lastSrc = this.src; + this._lastGuid = this.args.guid; } -}); +} diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index 5b83db413a..e9fb9695f7 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -242,10 +242,8 @@
    + class="gh-portal-siteiframe {{if this.hidePreviewFrame "invisible"}}" />

    diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 319c480747..3e550cda1e 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -51,10 +51,7 @@ {{#if (eq this.settings.membersSignupAccess 'none')}} PORTAL DISABLED {{else}} - + {{/if}}
    From da5f7e9c126b3e5104cf5f1c581c7cca6c1dbfa2 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 18 May 2021 16:36:18 +0100 Subject: [PATCH 0308/3032] Fixed flash of site when portal preview is loading no issue - added `@invisibleUntilLoaded` boolean argument to `` - when set to true add `.invisible` class until iframe's `load` event is triggered - removed manual iframe hiding with 1.2sec delay from portal settings modal - added `@onLoad` argument to `` for consumers to hook in if needed --- app/components/gh-site-iframe.hbs | 3 ++- app/components/gh-site-iframe.js | 11 +++++++++++ app/components/modal-portal-settings.hbs | 3 ++- app/components/modal-portal-settings.js | 6 ------ app/templates/settings/membership.hbs | 4 +++- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/components/gh-site-iframe.hbs b/app/components/gh-site-iframe.hbs index db1910017f..c845266a41 100644 --- a/app/components/gh-site-iframe.hbs +++ b/app/components/gh-site-iframe.hbs @@ -1,8 +1,9 @@ \ No newline at end of file diff --git a/app/components/gh-site-iframe.js b/app/components/gh-site-iframe.js index 97adf18870..8a3a6e53f3 100644 --- a/app/components/gh-site-iframe.js +++ b/app/components/gh-site-iframe.js @@ -1,10 +1,13 @@ import Component from '@glimmer/component'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; +import {tracked} from '@glimmer/tracking'; export default class GhSiteIframeComponent extends Component { @service config; + @tracked isInvisible = this.args.invisibleUntilLoaded; + get srcUrl() { return this.args.src || `${this.config.get('blogUrl')}/`; } @@ -20,4 +23,12 @@ export default class GhSiteIframeComponent extends Component { } this._lastGuid = this.args.guid; } + + @action + onLoad(event) { + if (this.args.invisibleUntilLoaded) { + this.isInvisible = false; + } + this.args.onLoad?.(event); + } } diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index e9fb9695f7..232c947c72 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -242,8 +242,9 @@
    + @invisibleUntilLoaded={{true}} />
    diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index 35af1eea8c..ee7c19c858 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -88,7 +88,6 @@ export default ModalComponent.extend({ init() { this._super(...arguments); - this.set('hidePreviewFrame', true); this.buttonStyleOptions = [ {name: 'icon-and-text', label: 'Icon and text'}, {name: 'icon-only', label: 'Icon only'}, @@ -108,11 +107,6 @@ export default ModalComponent.extend({ didInsertElement() { this._super(...arguments); this.settings.get('errors').clear(); - run.later(this, function () { - if (!this.isDestroyed && !this.isDestroying) { - this.set('hidePreviewFrame', false); - } - }, 1200); }, actions: { diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 3e550cda1e..19912a20b0 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -51,7 +51,9 @@ {{#if (eq this.settings.membersSignupAccess 'none')}} PORTAL DISABLED {{else}} - + {{/if}}
    From a9530c97099911329af03156787a71d98f7966eb Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 18 May 2021 16:38:29 +0100 Subject: [PATCH 0309/3032] Fixed linting error --- app/components/modal-portal-settings.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index ee7c19c858..3e48598669 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -3,7 +3,6 @@ import ModalComponent from 'ghost-admin/components/modal-base'; import copyTextToClipboard from 'ghost-admin/utils/copy-text-to-clipboard'; import {computed} from '@ember/object'; import {htmlSafe} from '@ember/template'; -import {run} from '@ember/runloop'; import {inject as service} from '@ember/service'; import {task, timeout} from 'ember-concurrency'; const ICON_EXTENSIONS = ['gif', 'jpg', 'jpeg', 'png', 'svg']; From 476d7ccd9f97297bbb61b95615f26c4b8fef96cc Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 18 May 2021 21:50:15 +0530 Subject: [PATCH 0310/3032] Updated portal plans on monthly/yearly price change no refs Portal plans setting contains list of prices that are allowed by site owner to use in Portal UI. Since we now switch monthly/yearly prices dynamically, we need to update portal plans on price change to still reflect updated monthly/yearly prices in Portal UI. --- app/controllers/settings/membership.js | 18 ++++++++++++++++++ app/templates/settings/membership.hbs | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 71f92ed5eb..f2ec8f2437 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -233,6 +233,7 @@ export default class MembersAccessController extends Controller { ); } if (monthlyPrice && yearlyPrice) { + this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id); this.settings.set('membersMonthlyPriceId', monthlyPrice.id); this.settings.set('membersYearlyPriceId', yearlyPrice.id); return this.product; @@ -242,6 +243,7 @@ export default class MembersAccessController extends Controller { const updatedStripePrices = savedProduct.stripePrices || []; const updatedMonthlyPrice = getActivePrice(updatedStripePrices, 'month', monthlyAmount); const updatedYearlyPrice = getActivePrice(updatedStripePrices, 'year', yearlyAmount); + this.updatePortalPlans(updatedMonthlyPrice.id, updatedYearlyPrice.id); this.settings.set('membersMonthlyPriceId', updatedMonthlyPrice.id); this.settings.set('membersYearlyPriceId', updatedYearlyPrice.id); return savedProduct; @@ -249,6 +251,22 @@ export default class MembersAccessController extends Controller { } } + updatePortalPlans(monthlyPriceId, yearlyPriceId) { + let portalPlans = this.settings.get('portalPlans') || []; + const currentMontlyPriceId = this.settings.get('membersMonthlyPriceId'); + const currentYearlyPriceId = this.settings.get('membersYearlyPriceId'); + if (portalPlans.includes(currentMontlyPriceId)) { + portalPlans = portalPlans.filter(d => d.id !== currentMontlyPriceId); + portalPlans.push(monthlyPriceId); + } + + if (portalPlans.includes(currentYearlyPriceId)) { + portalPlans = portalPlans.filter(d => d.id !== currentYearlyPriceId); + portalPlans.push(yearlyPriceId); + } + this.settings.set('portalPlans', portalPlans); + } + getPrice(prices, type) { const monthlyPriceId = this.settings.get('membersMonthlyPriceId'); const yearlyPriceId = this.settings.get('membersYearlyPriceId'); diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 19912a20b0..104b55e618 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -167,7 +167,7 @@ @placeholder='' data-test-title-input={{true}} /> - {{this.currency}}/month + {{this.currency}}/year
    {{#if this.stripePlanError}} From 8e4b076425b0e719c081a3aff7982326343963ee Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 18 May 2021 22:05:29 +0530 Subject: [PATCH 0311/3032] Updated portal links UI to fixed values no refs We are reverting Portal links to use monthly/yearly for now instead of price ids, this change updates to use old nickname and if mapping. --- app/components/gh-portal-links.hbs | 8 ++++---- app/components/gh-portal-links.js | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/components/gh-portal-links.hbs b/app/components/gh-portal-links.hbs index 4f32bfd9af..1c12723911 100644 --- a/app/components/gh-portal-links.hbs +++ b/app/components/gh-portal-links.hbs @@ -83,18 +83,18 @@ {{#each this.filteredPrices as |price|}} - Sign up/{{price.nickname}} + Sign up/{{price.oldNickname}}
    {{#if isLink}} - {{this.siteUrl}}/#/portal/signup/{{price.id}} + {{this.siteUrl}}/#/portal/signup/{{price.oldId}} {{else}} - data-portal="signup/{{price.id}}" + data-portal="signup/{{price.oldId}}" {{/if}}
    From 65ef4b535bd6fa23b85e7afe9d941a55aaa6f9f5 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Tue, 18 May 2021 22:59:34 +0530 Subject: [PATCH 0313/3032] Updated portal preview to update on price change no refs Portal preview on membership settings reflects the currently set monthly/yearly price directly by passing in the updated amount to portal preview URL --- app/controllers/settings/membership.js | 27 +++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 47a0e454a7..d561532457 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -177,13 +177,29 @@ export default class MembersAccessController extends Controller { @action updatePortalPreview() { // TODO: can these be worked out from settings in membersUtils? - const monthlyPrice = this.stripeMonthlyAmount; - const yearlyPrice = this.stripeYearlyAmount; + const monthlyPrice = this.stripeMonthlyAmount * 100; + const yearlyPrice = this.stripeYearlyAmount * 100; + let portalPlans = this.settings.get('portalPlans') || []; + const currentMontlyPriceId = this.settings.get('membersMonthlyPriceId'); + const currentYearlyPriceId = this.settings.get('membersYearlyPriceId'); + let isMonthlyChecked = false; + let isYearlyChecked = false; + if (portalPlans.includes(currentMontlyPriceId)) { + isMonthlyChecked = true; + } + + if (portalPlans.includes(currentYearlyPriceId)) { + isYearlyChecked = true; + } this.portalPreviewUrl = this.membersUtils.getPortalPreviewUrl({ button: false, monthlyPrice, - yearlyPrice + yearlyPrice, + currency: this.currency, + isMonthlyChecked, + isYearlyChecked, + portalPlans: null }); this.resizePortalPreviewTask.perform(); @@ -291,12 +307,12 @@ export default class MembersAccessController extends Controller { const currentMontlyPriceId = this.settings.get('membersMonthlyPriceId'); const currentYearlyPriceId = this.settings.get('membersYearlyPriceId'); if (portalPlans.includes(currentMontlyPriceId)) { - portalPlans = portalPlans.filter(d => d.id !== currentMontlyPriceId); + portalPlans = portalPlans.filter(priceId => priceId !== currentMontlyPriceId); portalPlans.push(monthlyPriceId); } if (portalPlans.includes(currentYearlyPriceId)) { - portalPlans = portalPlans.filter(d => d.id !== currentYearlyPriceId); + portalPlans = portalPlans.filter(priceId => priceId !== currentYearlyPriceId); portalPlans.push(yearlyPriceId); } this.settings.set('portalPlans', portalPlans); @@ -341,6 +357,7 @@ export default class MembersAccessController extends Controller { if (yearlyPrice && yearlyPrice.amount) { this.stripeYearlyAmount = (yearlyPrice.amount / 100); } + this.updatePortalPreview(); } } From 3c77d4e2609b690eab7e7e95471a735c8d9e6189 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Tue, 18 May 2021 22:17:46 +0200 Subject: [PATCH 0314/3032] Styled access dropdowns pseudo-classes --- app/styles/layouts/settings.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 2a37c307c5..6f92bb7121 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1478,6 +1478,22 @@ p.theme-validation-details { background: var(--white); } +.gh-setting-dropdown[aria-disabled="true"] { + background: var(--whitegrey-l2); +} + +.gh-setting-dropdown[aria-disabled="true"] svg path { + fill: var(--lightgrey-d1); +} + +.gh-setting-dropdown[aria-disabled="true"] .gh-radio-label { + opacity: .65; +} + +.gh-setting-dropdown:focus-visible { + outline: none; +} + .gh-setting-dropdown .ember-power-select-status-icon { right: 24px; } From 202bb771fbdac7c9674921c3b23983fcfe0c0174 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 09:50:54 +0100 Subject: [PATCH 0315/3032] Update dependency @tryghost/helpers to v1.1.45 (#1963) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b9045e648b..35b433c398 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "2.0.0", - "@tryghost/helpers": "1.1.44", + "@tryghost/helpers": "1.1.45", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", "@tryghost/limit-service": "0.5.0", diff --git a/yarn.lock b/yarn.lock index d39e1c1760..31858ce416 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1650,10 +1650,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@tryghost/helpers@1.1.44": - version "1.1.44" - resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.44.tgz#9ac28624109ec4c84d51be369fc514266f5c65d0" - integrity sha512-oeCTguxn10/1mEqMUkuV+on7vJcO298KH+IEHY4RWCtUBkhsj3VBNqwfVcmuevhWx1h4uBNISP2AxsAIEdsIkw== +"@tryghost/helpers@1.1.45": + version "1.1.45" + resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.45.tgz#811c1d4c5a8a4f3e513b26dd893fa061d3c9afb1" + integrity sha512-AJgCnHXKthN4+u0WJtLyFXFpk2vsp6vv8PIJ7Ve3cT/EtWDKzFjMNRghEnEuMiyrchUZt0M+oRcAxf7VDHIy2Q== dependencies: lodash-es "^4.17.11" From 97273db6f0019da00803a9fe780d025b8debc60d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 09:51:06 +0100 Subject: [PATCH 0316/3032] Update dependency @tryghost/timezone-data to v0.2.43 (#1964) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 35b433c398..eea59de9ca 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.19", - "@tryghost/timezone-data": "0.2.42", + "@tryghost/timezone-data": "0.2.43", "autoprefixer": "9.8.6", "babel-eslint": "10.1.0", "blueimp-md5": "2.18.0", diff --git a/yarn.lock b/yarn.lock index 31858ce416..83242b94cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1699,10 +1699,10 @@ dependencies: unidecode "^0.1.8" -"@tryghost/timezone-data@0.2.42": - version "0.2.42" - resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.42.tgz#dcd59e2262e73a2df3aa7de28354f1eb41d483ad" - integrity sha512-2nt7gGougbkIvZgnhh3hBCLjcWgXIDGc+dM8Ixwhl0uo8fx/8OHM88UoDHkpgvz8Z8LNS7c33/stveIEO/HO2A== +"@tryghost/timezone-data@0.2.43": + version "0.2.43" + resolved "https://registry.yarnpkg.com/@tryghost/timezone-data/-/timezone-data-0.2.43.tgz#8bea7bdfd5dce1dcc8571eb64252f5c2a6d9f08e" + integrity sha512-jl07Eoh8vq3jsKN/NE8u8/RvZ0a/sw4zbAo7QonPh3cD1H3rnOxj4vIi5bEymEVuLJuSoLVJ9zJMeqsFwdmcYA== "@types/acorn@^4.0.3": version "4.0.5" From 30c19153303af20107e7650aaba451cd0b151d3e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 09:51:20 +0100 Subject: [PATCH 0317/3032] Update dependency ember-test-selectors to v5.2.0 (#1966) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index eea59de9ca..fa823e5161 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "ember-sinon": "5.0.0", "ember-source": "3.21.3", "ember-svg-jar": "2.3.3", - "ember-test-selectors": "5.1.0", + "ember-test-selectors": "5.2.0", "ember-tooltips": "3.4.7", "ember-truth-helpers": "3.0.0", "ember-useragent": "0.10.0", diff --git a/yarn.lock b/yarn.lock index 83242b94cc..ef33700034 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6849,10 +6849,10 @@ ember-svg-jar@2.3.3: mkdirp "^0.5.1" path-posix "^1.0.0" -ember-test-selectors@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-5.1.0.tgz#60c47ecee2dfe513eebe5c34565762eb67ce0530" - integrity sha512-gxK0ODCyKGnPahM3Ri3zbeoXVD7H06WRPrBr1gjjcul8MuD+e6B7kVcAnG6HlDNLFdlWARyZcFNI6fYCIYbgpg== +ember-test-selectors@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-5.2.0.tgz#1eab8698b9ab47c9e2fcf73f8c63623d1ed75007" + integrity sha512-k/qqdpnEZO8smmMXrxHlc1fgkilSq0rYLqopwqG9Q24/tHYb8DWQkYshJzjlSNKm328gaMFZ39YtyUIASXoRdg== dependencies: calculate-cache-key-for-tree "^2.0.0" ember-cli-babel "^7.26.4" From 70c25627223f83335dccf805afdad240b1c8d0fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 09:51:39 +0100 Subject: [PATCH 0318/3032] Update dependency ember-cli-babel to v7.26.6 (#1969) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index fa823e5161..69a1babc91 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "ember-classic-decorator": "2.0.0", "ember-cli": "3.21.2", "ember-cli-app-version": "5.0.0", - "ember-cli-babel": "7.26.5", + "ember-cli-babel": "7.26.6", "ember-cli-chart": "3.7.2", "ember-cli-dependency-checker": "3.2.0", "ember-cli-deprecation-workflow": "1.0.1", diff --git a/yarn.lock b/yarn.lock index ef33700034..d91d9018ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5727,10 +5727,10 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.26.5, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.4, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.26.5" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" - integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== +ember-cli-babel@7.26.6: + version "7.26.6" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" + integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== dependencies: "@babel/core" "^7.12.0" "@babel/helper-compilation-targets" "^7.12.0" @@ -5779,6 +5779,39 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.4, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: + version "7.26.5" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" + integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" + rimraf "^3.0.1" + semver "^5.5.0" + ember-cli-babel@~7.19.0: version "7.19.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.19.0.tgz#e6eddea18a867231fcf90a80689e92b98be9a63b" From 3cfd8cc1a1022dc2fb6194a720618eb45fe2f5f7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 09:52:53 +0100 Subject: [PATCH 0319/3032] Update dependency reframe.js to v3.0.3 (#1968) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 69a1babc91..20fa43ddd0 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "postcss-custom-properties": "10.0.0", "postcss-import": "12.0.1", "pretender": "3.4.3", - "reframe.js": "3.0.2", + "reframe.js": "3.0.3", "simplemde": "https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost", "testem": "3.4.1", "top-gh-contribs": "2.0.4", diff --git a/yarn.lock b/yarn.lock index d91d9018ec..d76d99e1dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12500,10 +12500,10 @@ redeyed@~1.0.0: dependencies: esprima "~3.0.0" -reframe.js@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/reframe.js/-/reframe.js-3.0.2.tgz#8c97c591f3c3266f74a1baf6d7261e4224f51bc0" - integrity sha512-R39DRjAdwwsKeBBue1VukDktqdjfP8SFvZk/FtXtELC3Axutvk48VIrhj0IRK2nW1impTeDJKBKTm9smy+P90w== +reframe.js@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/reframe.js/-/reframe.js-3.0.3.tgz#4a073e5d1d2105e10999acfaa969f9f696d701ea" + integrity sha512-DQ4MR949mKay3S3YV2kQ9my9RWCE5KGCf/mU0KYTt0Y0z/kaO2N/r7QfW0LaRmwv7T+d1gPagx7I9Gh9FcXK8Q== regenerate-unicode-properties@^8.2.0: version "8.2.0" From e3e1fa3353767c3729b1658ad42cc35f883470c5 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 19 May 2021 09:57:32 +0100 Subject: [PATCH 0320/3032] Lock file maintenance --- yarn.lock | 422 +++++++++++++++++++++++++----------------------------- 1 file changed, 195 insertions(+), 227 deletions(-) diff --git a/yarn.lock b/yarn.lock index d76d99e1dd..f27ee603af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,25 +16,25 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8", "@babel/compat-data@^7.14.0": +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.11.0", "@babel/core@^7.12.0", "@babel/core@^7.12.16", "@babel/core@^7.12.3", "@babel/core@^7.13.10", "@babel/core@^7.3.4", "@babel/core@^7.8.7", "@babel/core@^7.9.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" - integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" + integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.0" + "@babel/generator" "^7.14.3" "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-module-transforms" "^7.14.2" "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.0" + "@babel/parser" "^7.14.3" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -43,20 +43,20 @@ source-map "^0.5.0" "@babel/eslint-parser@^7.12.16": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.13.14.tgz#f80fd23bdd839537221914cb5d17720a5ea6ba3a" - integrity sha512-I0HweR36D73Ibn/FfrRDMKlMqJHFwidIUgYdMpH+aXYuQC+waq59YaJ6t9e9N36axJ82v1jR041wwqDrDXEwRA== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.14.3.tgz#8f292caf83dd2d7b364f938fe7074806af6d70ea" + integrity sha512-IfJXKEVRV/Gisvgmih/+05gkBzzg4Dy0gcxkZ84iFiLK8+O+fI1HLnGJv3UrUMPpsMmmThNa69v+UnF80XP+kA== dependencies: eslint-scope "^5.1.0" - eslint-visitor-keys "^1.3.0" + eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.14.0": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz#1f99331babd65700183628da186f36f63d615c93" - integrity sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ== +"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== dependencies: - "@babel/types" "^7.14.1" + "@babel/types" "^7.14.2" jsesc "^2.5.1" source-map "^0.5.0" @@ -75,7 +75,7 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8", "@babel/helper-compilation-targets@^7.8.7": +"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.8.7": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== @@ -85,22 +85,22 @@ browserslist "^4.14.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.13.11", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.1.tgz#1fe11b376f3c41650ad9fedc665b0068722ea76c" - integrity sha512-r8rsUahG4ywm0QpGcCrLaUSOuNAISR3IZCg4Fx05Ozq31aCUrQsTLH6KPxy0N5ULoQ4Sn9qjNdGNtbPWAC6hYg== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.2", "@babel/helper-create-class-features-plugin@^7.14.3", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz#832111bcf4f57ca57a4c5b1a000fc125abc6554a" + integrity sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-replace-supers" "^7.14.3" "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" - integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688" + integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" @@ -126,14 +126,14 @@ dependencies: "@babel/types" "^7.13.0" -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== +"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" + integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== dependencies: "@babel/helper-get-function-arity" "^7.12.13" "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.2" "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" @@ -164,10 +164,10 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" - integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" + integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== dependencies: "@babel/helper-module-imports" "^7.13.12" "@babel/helper-replace-supers" "^7.13.12" @@ -175,8 +175,8 @@ "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-validator-identifier" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -199,15 +199,15 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" - integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600" + integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA== dependencies: "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" "@babel/helper-simple-access@^7.13.12": version "7.13.12" @@ -268,10 +268,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.14.0", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.7": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" - integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== +"@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.7": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" + integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" @@ -282,10 +282,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/plugin-proposal-async-generator-functions@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" - integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== +"@babel/plugin-proposal-async-generator-functions@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e" + integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" @@ -300,93 +300,94 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-proposal-class-static-block@^7.13.11": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz#6fcbba4a962702c17e5371a0c7b39afde186d703" - integrity sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" + integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.3" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-class-static-block" "^7.12.13" "@babel/plugin-proposal-decorators@^7.13.5", "@babel/plugin-proposal-decorators@^7.8.3": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz#e91ccfef2dc24dd5bd5dcc9fc9e2557c684ecfb8" - integrity sha512-ibAMAqUm97yzi+LPgdr5Nqb9CMkeieGHvwPg1ywSGjZrZHQEGqE01HmOio8kxRpA/+VtOHouIVy2FMpBbtltjA== + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.2.tgz#e68c3c5e4a6a08834456568256fc3e71b93590cf" + integrity sha512-LauAqDd/VjQDtae58QgBcEOE42NNP+jB2OE+XeC3KBI/E+BhhRjtr5viCIrj1hmu1YvrguLipIPRJZmS5yUcFw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.11" + "@babel/helper-create-class-features-plugin" "^7.14.2" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-decorators" "^7.12.13" -"@babel/plugin-proposal-dynamic-import@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== +"@babel/plugin-proposal-dynamic-import@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f" + integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791" + integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== +"@babel/plugin-proposal-json-strings@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c" + integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== +"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7" + integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" - integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2", "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546" + integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e" + integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-object-rest-spread@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz#e17d418f81cc103fedd4ce037e181c8056225abc" + integrity sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" + "@babel/compat-data" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.2" -"@babel/plugin-proposal-optional-catch-binding@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== +"@babel/plugin-proposal-optional-catch-binding@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717" + integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.6.0": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" - integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2", "@babel/plugin-proposal-optional-chaining@^7.6.0": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e" + integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" @@ -553,23 +554,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.14.1", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.1.tgz#ac1b3a8e3d8cbb31efc6b9be2f74eb9823b74ab2" - integrity sha512-2mQXd0zBrwfp0O1moWIhPpEeTKDvxyHcnma3JATVP1l+CctWBuot6OJG8LQ4DnBj4ZZPSmlb/fm4mu47EOAnVA== +"@babel/plugin-transform-block-scoping@^7.14.2", "@babel/plugin-transform-block-scoping@^7.8.3": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz#761cb12ab5a88d640ad4af4aa81f820e6b5fdf5c" + integrity sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-classes@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" - integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== +"@babel/plugin-transform-classes@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz#3f1196c5709f064c252ad056207d87b7aeb2d03d" + integrity sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-optimise-call-expression" "^7.12.13" "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" @@ -639,12 +640,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.10.5", "@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.14.0", "@babel/plugin-transform-modules-amd@^7.9.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz#589494b5b290ff76cf7f59c798011f6d77026553" - integrity sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ== +"@babel/plugin-transform-modules-amd@^7.10.5", "@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.14.2", "@babel/plugin-transform-modules-amd@^7.9.0": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" + integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== dependencies: - "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-module-transforms" "^7.14.2" "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" @@ -706,10 +707,10 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" - integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== +"@babel/plugin-transform-parameters@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31" + integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -735,9 +736,9 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.13.9", "@babel/plugin-transform-runtime@^7.9.0": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" - integrity sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz#1fd885a2d0de1d3c223795a4e9be72c2db4515cf" + integrity sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg== dependencies: "@babel/helper-module-imports" "^7.13.12" "@babel/helper-plugin-utils" "^7.13.0" @@ -783,11 +784,11 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-typescript@^7.13.0", "@babel/plugin-transform-typescript@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" - integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.3.tgz#44f67f725a60cccee33d9d6fee5e4f338258f34f" + integrity sha512-G5Bb5pY6tJRTC4ag1visSgiDoGgJ1u1fMUgmc2ijLkcIdzP83Q1qyZX4ggFQ/SkR+PNOatkaYC+nKcTlpsX4ag== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.3" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-typescript" "^7.12.13" @@ -841,27 +842,27 @@ regenerator-runtime "^0.13.4" "@babel/preset-env@^7.10.2", "@babel/preset-env@^7.12.0", "@babel/preset-env@^7.9.0": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.1.tgz#b55914e2e68885ea03f69600b2d3537e54574a93" - integrity sha512-0M4yL1l7V4l+j/UHvxcdvNfLB9pPtIooHTbEhgD/6UGyh8Hy3Bm1Mj0buzjDXATCSz3JFibVdnoJZCrlUCanrQ== + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.2.tgz#e80612965da73579c84ad2f963c2359c71524ed5" + integrity sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ== dependencies: "@babel/compat-data" "^7.14.0" "@babel/helper-compilation-targets" "^7.13.16" "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-validator-option" "^7.12.17" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.15" + "@babel/plugin-proposal-async-generator-functions" "^7.14.2" "@babel/plugin-proposal-class-properties" "^7.13.0" "@babel/plugin-proposal-class-static-block" "^7.13.11" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-dynamic-import" "^7.14.2" + "@babel/plugin-proposal-export-namespace-from" "^7.14.2" + "@babel/plugin-proposal-json-strings" "^7.14.2" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" + "@babel/plugin-proposal-numeric-separator" "^7.14.2" + "@babel/plugin-proposal-object-rest-spread" "^7.14.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" + "@babel/plugin-proposal-optional-chaining" "^7.14.2" "@babel/plugin-proposal-private-methods" "^7.13.0" "@babel/plugin-proposal-private-property-in-object" "^7.14.0" "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" @@ -882,8 +883,8 @@ "@babel/plugin-transform-arrow-functions" "^7.13.0" "@babel/plugin-transform-async-to-generator" "^7.13.0" "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.14.1" - "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-block-scoping" "^7.14.2" + "@babel/plugin-transform-classes" "^7.14.2" "@babel/plugin-transform-computed-properties" "^7.13.0" "@babel/plugin-transform-destructuring" "^7.13.17" "@babel/plugin-transform-dotall-regex" "^7.12.13" @@ -893,14 +894,14 @@ "@babel/plugin-transform-function-name" "^7.12.13" "@babel/plugin-transform-literals" "^7.12.13" "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.14.0" + "@babel/plugin-transform-modules-amd" "^7.14.2" "@babel/plugin-transform-modules-commonjs" "^7.14.0" "@babel/plugin-transform-modules-systemjs" "^7.13.8" "@babel/plugin-transform-modules-umd" "^7.14.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" "@babel/plugin-transform-new-target" "^7.12.13" "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.2" "@babel/plugin-transform-property-literals" "^7.12.13" "@babel/plugin-transform-regenerator" "^7.13.15" "@babel/plugin-transform-reserved-words" "^7.12.13" @@ -912,7 +913,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.12.13" "@babel/plugin-transform-unicode-regex" "^7.12.13" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.1" + "@babel/types" "^7.14.2" babel-plugin-polyfill-corejs2 "^0.2.0" babel-plugin-polyfill-corejs3 "^0.2.0" babel-plugin-polyfill-regenerator "^0.2.0" @@ -953,24 +954,24 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" - integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== +"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" + integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.0" - "@babel/helper-function-name" "^7.12.13" + "@babel/generator" "^7.14.2" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.0" - "@babel/types" "^7.14.0" + "@babel/parser" "^7.14.2" + "@babel/types" "^7.14.2" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.1", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.7": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" - integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== +"@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.7": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" + integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== dependencies: "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" @@ -1805,9 +1806,9 @@ integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== "@types/node@*": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67" - integrity sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA== + version "15.3.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.3.0.tgz#d6fed7d6bc6854306da3dea1af9f874b00783e26" + integrity sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ== "@types/node@^9.6.0": version "9.6.61" @@ -2117,9 +2118,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.1: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.3.0.tgz#25ee7348e32cdc4a1dbb38256bf6bdc451dd577c" - integrity sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q== + version "8.4.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.4.0.tgz#48984fdb2ce225cab15795f0772a8d85669075e4" + integrity sha512-7QD2l6+KBSLwf+7MuYocbWvRPdOu63/trReTLu2KFwkgctnub1auoF+Y1WYcm09CTM7quuscrzqmASaLHC/K4Q== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2213,11 +2214,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: color-convert "^2.0.1" ansi-to-html@^0.6.6: - version "0.6.14" - resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.14.tgz#65fe6d08bba5dd9db33f44a20aec331e0010dad8" - integrity sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA== + version "0.6.15" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" + integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ== dependencies: - entities "^1.1.2" + entities "^2.0.0" ansicolors@~0.2.1: version "0.2.1" @@ -5599,9 +5600,9 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.723: - version "1.3.727" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" - integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== + version "1.3.731" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.731.tgz#9f17f7e16f798eaddb21409d80aa755b5b5053dc" + integrity sha512-dn1Nyd0DuFa3xhqZJr6/L9phyk+YXJpvrz6Vcu6mFxFqr5TQ9r/F3yvOYFUrEwY4Tbb1YBjN19TDKnSVCQvalA== element-closest@^3.0.2: version "3.0.2" @@ -5727,7 +5728,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.26.6: +ember-cli-babel@7.26.6, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.4, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -5779,39 +5780,6 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.4, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: - version "7.26.5" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.5.tgz#59904d1d73b5c816167238024d18b85c8b51debc" - integrity sha512-XLMk59yNJneItn/hkJn+kHjnnszdfXWo1sP95C0kouSfPtIsUC3a/f/FW6c59D8koPANJOIHiHP3zUpTpKsnTA== - dependencies: - "@babel/core" "^7.12.0" - "@babel/helper-compilation-targets" "^7.12.0" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-decorators" "^7.13.5" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-runtime" "^7.13.9" - "@babel/plugin-transform-typescript" "^7.13.0" - "@babel/polyfill" "^7.11.5" - "@babel/preset-env" "^7.12.0" - "@babel/runtime" "7.12.18" - amd-name-resolver "^1.3.1" - babel-plugin-debug-macros "^0.3.4" - babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.5.0" - babel-plugin-module-resolver "^3.2.0" - broccoli-babel-transpiler "^7.8.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.2" - broccoli-source "^2.1.2" - clone "^2.1.2" - ember-cli-babel-plugin-helpers "^1.1.1" - ember-cli-version-checker "^4.1.0" - ensure-posix-path "^1.0.2" - fixturify-project "^1.10.0" - resolve-package-path "^3.1.0" - rimraf "^3.0.1" - semver "^5.5.0" - ember-cli-babel@~7.19.0: version "7.19.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.19.0.tgz#e6eddea18a867231fcf90a80689e92b98be9a63b" @@ -7038,7 +7006,7 @@ ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, en resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== -entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -7286,7 +7254,7 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0: +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== @@ -8376,9 +8344,9 @@ get-value@^2.0.3, get-value@^2.0.6: integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getobject@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/getobject/-/getobject-1.0.0.tgz#27eeb6394716cfb6adcef275a33c2752df9ca49a" - integrity sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag== + version "1.0.1" + resolved "https://registry.yarnpkg.com/getobject/-/getobject-1.0.1.tgz#17d86a05913c15d173a5bcf8662dc7c7ac5ce147" + integrity sha512-tj18lLe+917AACr6BdVoUuHnBPTVd9BEJp1vxnMZ58ztNvuxz9Ufa+wf3g37tlGITH35jggwZ2d9lcgHJJgXfQ== getpass@^0.1.1: version "0.1.7" @@ -10400,9 +10368,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" luxon@^1.26.0: - version "1.26.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.26.0.tgz#d3692361fda51473948252061d0f8561df02b578" - integrity sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A== + version "1.27.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.27.0.tgz#ae10c69113d85dab8f15f5e8390d0cbeddf4f00f" + integrity sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA== magic-string@^0.24.0: version "0.24.1" @@ -11110,9 +11078,9 @@ node-notifier@^9.0.1: which "^2.0.2" node-releases@^1.1.71: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== nopt@^3.0.6, nopt@~3.0.6: version "3.0.6" @@ -13457,9 +13425,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + version "3.0.8" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.8.tgz#eb1e97ad99b11bf3f82a3b71a0472dd9a00f2ecf" + integrity sha512-NDgA96EnaLSvtbM7trJj+t1LUR3pirkDCcz9nOUlPb5DMBGsH7oES6C3hs3j7R9oHEa1EMvReS/BUAIT5Tcr0g== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -13851,9 +13819,9 @@ table@^5.2.3: string-width "^3.0.0" table@^6.0.4: - version "6.7.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.0.tgz#26274751f0ee099c547f6cb91d3eff0d61d155b2" - integrity sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw== + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: ajv "^8.0.1" lodash.clonedeep "^4.5.0" @@ -14285,9 +14253,9 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.13.6" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.6.tgz#6815ac7fdd155d03c83e2362bb717e5b39b74013" - integrity sha512-rRprLwl8RVaS+Qvx3Wh5hPfPBn9++G6xkGlUupya0s5aDmNjI7z3lnRLB3u7sN4OmbB0pWgzhM9BEJyiWAwtAA== + version "3.13.7" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.7.tgz#25468a3b39b1c875df03f0937b2b7036a93f3fee" + integrity sha512-1Psi2MmnZJbnEsgJJIlfnd7tFlJfitusmR7zDI8lXlFI0ACD4/Rm/xdrU8bh6zF0i74aiVoBtkRiFulkrmh3AA== unbox-primitive@^1.0.0: version "1.0.1" @@ -14929,9 +14897,9 @@ xmldom@^0.6.0: integrity sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg== xmlhttprequest-ssl@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.2.tgz#dd6899bfbcf684b554e393c30b13b9f3b001a7ee" - integrity sha512-tYOaldF/0BLfKuoA39QMwD4j2m8lq4DIncqj1yuNELX4vz9+z/ieG/vwmctjJce+boFHXstqhWnHSxc4W8f4qg== + version "1.6.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" + integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" From 85b346502efecc265a84fc7e54cb6ee1496da47e Mon Sep 17 00:00:00 2001 From: Rishabh Garg Date: Wed, 19 May 2021 19:56:45 +0530 Subject: [PATCH 0321/3032] Added SSL precondition for Stripe Connect UI (#1967) refs https://github.com/TryGhost/Team/issues/598 Stripe Webhooks require SSL in production, and so we should not be allowing connecting to Stripe in production mode unless the site is running with SSL. This change - - Updates Setup wizard to skip Stripe Connect steps if site is not on SSL in production - Adds warning on set subscriptions page Co-authored-by: Peter Zimon --- .../gh-launch-wizard/set-pricing.hbs | 38 ++++++++- .../gh-launch-wizard/set-pricing.js | 41 ++++++---- app/controllers/launch.js | 80 +++++++++++++------ app/controllers/settings/membership.js | 6 ++ app/styles/layouts/fullscreen-wizard.css | 10 +++ app/styles/layouts/settings.css | 39 +++++++++ app/styles/patterns/buttons.css | 5 ++ app/styles/patterns/forms.css | 4 + app/templates/settings/membership.hbs | 13 ++- public/assets/icons/shield-lock.svg | 1 + 10 files changed, 192 insertions(+), 45 deletions(-) create mode 100644 public/assets/icons/shield-lock.svg diff --git a/app/components/gh-launch-wizard/set-pricing.hbs b/app/components/gh-launch-wizard/set-pricing.hbs index 85df67f6ec..49ac8392fd 100644 --- a/app/components/gh-launch-wizard/set-pricing.hbs +++ b/app/components/gh-launch-wizard/set-pricing.hbs @@ -1,7 +1,39 @@
    - {{#if this.isHidden}} -

    Subscriptions already set

    -

    You can change product subscription pricing and Portal look and feel in Settings.

    + {{#if this.isConnectDisallowed}} +
    +
    + {{svg-jar "shield-lock"}} +

    Your site is not secured

    +

    Paid memberships through Ghost can only be run on sites secured by SSL (HTTPS vs. HTTP). More information on adding a free SSL Certificate to your Ghost site can be found here.

    +
    +
    +
    Generate secure key
    +
    +
    Connect with Stripe
    +
    + Test mode +
    + +
    +
    +
    +
    + +
    +
    +
    + {{else if this.isHidden}} +
    +

    Subscriptions already set

    +

    You can change product subscription pricing and signup options in Membership settings.

    +
    {{else}}
    diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index dd2ec71771..299f7d4acb 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -1,4 +1,5 @@ import Component from '@glimmer/component'; +import envConfig from 'ghost-admin/config/environment'; import {action} from '@ember/object'; import {currencies, getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; @@ -35,6 +36,12 @@ export default class GhLaunchWizardSetPricingComponent extends Component { return this.currencies.findBy('value', this.currency); } + get isConnectDisallowed() { + const siteUrl = this.config.get('blogUrl'); + + return envConfig.environment !== 'development' && !/^https:/.test(siteUrl); + } + get disabled() { if (this.product) { return this.product.get('stripePrices') && this.product.get('stripePrices').length > 0; @@ -167,23 +174,27 @@ export default class GhLaunchWizardSetPricingComponent extends Component { @task *saveAndContinue() { - yield this.validateStripePlans(); + if (this.isHidden || !this.isConnectDisallowed) { + this.args.nextStep(); + } else { + yield this.validateStripePlans(); - if (this.stripePlanError) { - return false; + if (this.stripePlanError) { + return false; + } + const product = this.getProduct(); + const data = this.args.getData() || {}; + this.args.storeData({ + ...data, + product, + isFreeChecked: this.isFreeChecked, + isMonthlyChecked: this.isMonthlyChecked, + isYearlyChecked: this.isYearlyChecked, + monthlyAmount: this.stripeMonthlyAmount, + yearlyAmount: this.stripeYearlyAmount + }); + this.args.nextStep(); } - const product = this.getProduct(); - const data = this.args.getData() || {}; - this.args.storeData({ - ...data, - product, - isFreeChecked: this.isFreeChecked, - isMonthlyChecked: this.isMonthlyChecked, - isYearlyChecked: this.isYearlyChecked, - monthlyAmount: this.stripeMonthlyAmount, - yearlyAmount: this.stripeYearlyAmount - }); - this.args.nextStep(); } calculateDiscount(monthly, yearly) { diff --git a/app/controllers/launch.js b/app/controllers/launch.js index f36e40dbaf..e40db2649f 100644 --- a/app/controllers/launch.js +++ b/app/controllers/launch.js @@ -1,8 +1,34 @@ import Controller from '@ember/controller'; +import envConfig from 'ghost-admin/config/environment'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; import {tracked} from '@glimmer/tracking'; +const DEFAULT_STEPS = { + 'customise-design': { + title: 'Customise your site', + position: 'Step 1', + next: 'connect-stripe' + }, + 'connect-stripe': { + title: 'Connect to Stripe', + position: 'Step 2', + next: 'set-pricing', + back: 'customise-design', + skip: 'finalise' + }, + 'set-pricing': { + title: 'Set up subscriptions', + position: 'Step 3', + next: 'finalise', + back: 'connect-stripe' + }, + finalise: { + title: 'Launch your site', + position: 'Final step', + back: 'set-pricing' + } +}; export default class LaunchController extends Controller { @service config; @service router; @@ -15,34 +41,38 @@ export default class LaunchController extends Controller { @tracked step = 'customise-design'; @tracked data = null; - steps = { - 'customise-design': { - title: 'Customise your site', - position: 'Step 1', - next: 'connect-stripe' - }, - 'connect-stripe': { - title: 'Connect to Stripe', - position: 'Step 2', - next: 'set-pricing', - back: 'customise-design', - skip: 'finalise' - }, - 'set-pricing': { - title: 'Set up subscriptions', - position: 'Step 3', - next: 'finalise', - back: 'connect-stripe' - }, - finalise: { - title: 'Launch your site', - position: 'Final step', - back: 'set-pricing' - } - }; + steps = DEFAULT_STEPS; skippedSteps = []; + constructor(...args) { + super(...args); + const siteUrl = this.config.get('blogUrl'); + + if (envConfig.environment !== 'development' && !/^https:/.test(siteUrl)) { + this.steps = { + 'customise-design': { + title: 'Customise your site', + position: 'Step 1', + next: 'set-pricing' + }, + 'set-pricing': { + title: 'Set up subscriptions', + position: 'Step 2', + next: 'finalise', + back: 'customise-design' + }, + finalise: { + title: 'Launch your site', + position: 'Final step', + back: 'set-pricing' + } + }; + } else { + this.steps = DEFAULT_STEPS; + } + } + get currentStep() { return this.steps[this.step]; } diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index d561532457..629818be92 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -1,4 +1,5 @@ import Controller from '@ember/controller'; +import envConfig from 'ghost-admin/config/environment'; import {action} from '@ember/object'; import {currencies, getCurrencyOptions, getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; @@ -50,6 +51,11 @@ export default class MembersAccessController extends Controller { return CURRENCIES.findBy('value', this.currency); } + get isConnectDisallowed() { + const siteUrl = this.config.get('blogUrl'); + return envConfig.environment !== 'development' && !/^https:/.test(siteUrl); + } + leaveRoute(transition) { if (this.settings.get('hasDirtyAttributes')) { transition.abort(); diff --git a/app/styles/layouts/fullscreen-wizard.css b/app/styles/layouts/fullscreen-wizard.css index f888d8673c..dfea0d8232 100644 --- a/app/styles/layouts/fullscreen-wizard.css +++ b/app/styles/layouts/fullscreen-wizard.css @@ -85,6 +85,16 @@ line-height: 0; } +.gh-launch-wizard-settings-container .gh-setting-nossl-container { + border: 1px solid var(--whitegrey); + border-radius: 3px; +} + +.gh-launch-wizard-settings-container .gh-setting-nossl-container svg { + width: 48px; + height: 48px; +} + /* Connect Stripe settings */ .gh-launch-wizard-stripe-info { diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 6f92bb7121..34d376c622 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1812,3 +1812,42 @@ p.theme-validation-details { width: 100%; } } + +.gh-setting-nossl { + border-top: 1px solid var(--whitegrey-d1); + display: flex; + flex-direction: column; + align-items: center; + margin: 16px -24px -12px; +} + +.gh-setting-nossl-container { + display: flex; + flex-direction: column; + align-items: center; + padding: 32px; + text-align: center; + max-width: 520px; +} + +.gh-setting-nossl-container svg { + width: 44px; + height: 44px; + margin-bottom: 12px; +} + +.gh-setting-nossl-container svg path, +.gh-setting-nossl-container svg rect, +.gh-setting-nossl-container svg circle { + stroke-width: 1px; +} + +.gh-setting-nossl-container h4 { + font-size: 1.5rem; + font-weight: 600; +} + +.gh-setting-nossl-container p { + margin: 8px 0 0; + color: var(--midgrey); +} diff --git a/app/styles/patterns/buttons.css b/app/styles/patterns/buttons.css index e10ad14df9..be44e844d6 100644 --- a/app/styles/patterns/buttons.css +++ b/app/styles/patterns/buttons.css @@ -742,4 +742,9 @@ Usage: CTA buttons grouped together horizontally. .gh-btn-stripe-status.connected:before { background: var(--green); +} + +.stripe-connect.disabled { + pointer-events: none; + opacity: 0.5; } \ No newline at end of file diff --git a/app/styles/patterns/forms.css b/app/styles/patterns/forms.css index f56f6224e7..5646ad8d6d 100644 --- a/app/styles/patterns/forms.css +++ b/app/styles/patterns/forms.css @@ -557,6 +557,10 @@ textarea { transform: translateX(16px); } +.for-switch.disabled { + opacity: 0.5; + pointer-events: none; +} /* Select /* ---------------------------------------------------------- */ diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index eeb61f6ba0..b1044bad75 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -64,7 +64,7 @@

    Membership tiers

    - {{else}} - {{/if}}
    + {{#if this.isConnectDisallowed}} +
    +
    + {{svg-jar "shield-lock"}} +

    Your site is not secured

    +

    Paid memberships through Ghost can only be run on sites secured by SSL (HTTPS vs. HTTP). More information on adding a free SSL Certificate to your Ghost site can be found here.

    +
    +
    + {{/if}}
    {{#liquid-if this.paidOpen}}
    diff --git a/public/assets/icons/shield-lock.svg b/public/assets/icons/shield-lock.svg new file mode 100644 index 0000000000..0fac2e5db6 --- /dev/null +++ b/public/assets/icons/shield-lock.svg @@ -0,0 +1 @@ +shield-lock \ No newline at end of file From eeada81442572747a6daee58d3f3d7a85e02356a Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 19 May 2021 15:36:46 +0100 Subject: [PATCH 0322/3032] Fixed portal settings modal sometimes having stale data no issue On the membership screen we save settings before opening the portal settings modal but we weren't waiting for the save to finish which meant that the portal settings modal could load using stale data. - passed the save settings task in via the portal settings modal's model - added a `finishPreloading` action that contains all of the dynamic setup tasks that were previously in the component's `init` method - if a preload task was passed in and it's currently running (as it would be if the modal is opened via the membership screen button) then it will wait for the task to finish before running the setup tasks - trigger the `finishPreloading` action when the modal is rendered - show a loading spinner in place of the modal contents whilst pre-loading --- app/components/modal-portal-settings.hbs | 6 +++++- app/components/modal-portal-settings.js | 27 ++++++++++++++++-------- app/templates/settings/membership.hbs | 1 + 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index 232c947c72..6804a1e9c3 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -1,5 +1,8 @@ {{#unless this.member.isNew}} {{#if this.isAddComplimentaryAllowed}} - + {{#if this.isCreatingComplimentary}} + Loading... + {{else}} + + {{/if}} {{/if}} {{/unless}}
    @@ -181,9 +185,13 @@ {{/each}} {{#if this.isAddComplimentaryAllowed}} {{/if}}
    diff --git a/app/components/gh-member-settings-form-cp.js b/app/components/gh-member-settings-form-cp.js index 50280dae14..91e80c16d9 100644 --- a/app/components/gh-member-settings-form-cp.js +++ b/app/components/gh-member-settings-form-cp.js @@ -79,6 +79,11 @@ export default class extends Component { return null; } + get isCreatingComplimentary() { + const {comped} = this.member.changedAttributes() || {}; + return comped && comped[0] === false && comped[1] === true && this.args.isSaveRunning; + } + @action setProperty(property, value) { this.args.setProperty(property, value); @@ -103,6 +108,7 @@ export default class extends Component { continueSubscription(subscriptionId) { this.continueSubscriptionTask.perform(subscriptionId); } + @action addCompedSubscription() { this.args.setProperty('comped', true); diff --git a/app/templates/member.hbs b/app/templates/member.hbs index fdfe6793ae..a1b487d88c 100644 --- a/app/templates/member.hbs +++ b/app/templates/member.hbs @@ -32,6 +32,7 @@ @scratchMember={{this.scratchMember}} @setProperty={{this.setProperty}} @saveMember={{this.save}} + @isSaveRunning={{this.saveTask.isRunning}} @isLoading={{this.isLoading}} /> From ded04d1d19c935e9ef0f09c227ec0cd00eff5362 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Thu, 20 May 2021 00:15:22 +0530 Subject: [PATCH 0333/3032] Fixed loading indicator on comped subscription no refs --- app/components/gh-member-settings-form-cp.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.js b/app/components/gh-member-settings-form-cp.js index 91e80c16d9..ed4f95a94d 100644 --- a/app/components/gh-member-settings-form-cp.js +++ b/app/components/gh-member-settings-form-cp.js @@ -80,8 +80,7 @@ export default class extends Component { } get isCreatingComplimentary() { - const {comped} = this.member.changedAttributes() || {}; - return comped && comped[0] === false && comped[1] === true && this.args.isSaveRunning; + return this.args.isSaveRunning; } @action From 834d8558e9c6860167bfe1c83bd443e7257a249a Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 19 May 2021 20:56:29 +0200 Subject: [PATCH 0334/3032] Added spinner for loading manually created subscription --- app/components/gh-member-settings-form-cp.hbs | 5 ++++- app/styles/layouts/members.css | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index 5687f2c54c..394e97bb8b 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -107,11 +107,14 @@ {{#unless this.products}}
    + {{#unless this.isCreatingComplimentary}}
    This member doesn't have subscriptions.
    + {{/unless}} + {{#unless this.member.isNew}} {{#if this.isAddComplimentaryAllowed}} {{#if this.isCreatingComplimentary}} - Loading... + {{else}} to take payments + You need to to take payments
    {{/if}}
    @@ -247,6 +247,7 @@
    diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index 0c62295c7f..573caa9300 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -23,6 +23,7 @@ export default ModalComponent.extend({ paidSignupRedirect: undefined, prices: null, isPreloading: true, + portalPreviewGuid: 'modal-portal-settings', confirm() {}, @@ -203,8 +204,8 @@ export default ModalComponent.extend({ }, openStripeSettings() { + this.isWaitingForStripeConnection = true; this.model.openStripeSettings(); - this.closeModal(); }, leaveSettings() { @@ -272,6 +273,15 @@ export default ModalComponent.extend({ this.set('isPreloading', false); }), + refreshAfterStripeConnected: action(async function () { + if (this.isWaitingForStripeConnection) { + await this.finishPreloading(); + this.notifyPropertyChange('page'); // force preview url to recompute + this.set('portalPreviewGuid', Date.now().valueOf()); // force preview re-render + this.isWaitingForStripeConnection = false; + } + }), + copyLinkOrAttribute: task(function* () { copyTextToClipboard(this.showModalLinkOrAttribute); yield timeout(this.isTesting ? 50 : 3000); diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 4d50a771d9..9c6728d632 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -144,6 +144,11 @@ export default class MembersAccessController extends Controller { } } + @action + openStripeConnect() { + this.showStripeConnect = true; + } + @action closeStripeConnect() { this.showStripeConnect = false; diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 7ab73ef27a..7bfba8b65f 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -68,7 +68,7 @@

    Membership tiers

    - + {{else}} - {{/if}} @@ -178,7 +179,7 @@ @value={{readonly this.stripeYearlyAmount}} @type="number" @input={{action (mut this.stripeYearlyAmount) value="target.value"}} - @focus-out={{action "validateStripePlans"}} + @focus-out={{this.validateStripePlans}} @placeholder='' data-test-title-input={{true}} /> @@ -195,8 +196,8 @@ {{/if}} \ No newline at end of file From 3f8eac3ff6ba56adc1d94c19e4bbe214dd5dbf13 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 20 May 2021 14:43:04 +0100 Subject: [PATCH 0344/3032] Fixed portal preview not updating when changing from a saved "Nobody" access no issue When members signup access is saved as "none" the front-end won't inject the portal script when rendering meaning changing to "all" or "invite" in Admin will show the preview but there's no portal script injected for the portal to show up. - detect when we're switching from a saved "none" state and force a save and full refresh of the iframe --- app/controllers/settings/membership.js | 16 ++++++++++++++++ app/templates/settings/membership.hbs | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index f83c39b45b..b0d15b0c95 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -102,6 +102,22 @@ export default class MembersAccessController extends Controller { this.leaveSettingsTransition = null; } + @action + async membersSubscriptionAccessChanged() { + const [oldValue] = this.settings.changedAttributes().membersSignupAccess; + + if (oldValue === 'none') { + // when saved value is 'none' the server won't inject the portal script + // to work around that and show the expected portal preview we save and + // force a refresh + await this.saveSettingsTask.perform(); + this.updatePortalPreview(); + this.portalPreviewGuid = Date.now().valueOf(); + } else { + this.updatePortalPreview(); + } + } + @action setStripePlansCurrency(event) { const newCurrency = event.value; diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index c3f2f17e93..3045f633a3 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -41,7 +41,7 @@
    - +
    From 9dc75f81bc7f301e91e24bde87bc403194eb5689 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 20 May 2021 15:00:46 +0100 Subject: [PATCH 0345/3032] Fixed error when changing subscription access back to saved setting no issue - if you switch back to the saved subscription access setting we attempted to use destructuring assignment from an `undefined` value - switched to using direct assignment and optional chaining --- app/controllers/settings/membership.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index b0d15b0c95..0da6ada778 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -104,7 +104,7 @@ export default class MembersAccessController extends Controller { @action async membersSubscriptionAccessChanged() { - const [oldValue] = this.settings.changedAttributes().membersSignupAccess; + const oldValue = this.settings.changedAttributes().membersSignupAccess?.[0]; if (oldValue === 'none') { // when saved value is 'none' the server won't inject the portal script From e239ba6107f3e6e78104943ea086220ab27dac16 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Thu, 20 May 2021 20:47:23 +0530 Subject: [PATCH 0346/3032] Added default price creation on stripe connect no refs On Stripe connect, we add the default prices on the new Stripe account in the DB so the site has prices in Portal checked from the start --- .../gh-members-payments-setting.hbs | 2 +- app/components/gh-members-payments-setting.js | 72 +++++++++++++++++-- 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/app/components/gh-members-payments-setting.hbs b/app/components/gh-members-payments-setting.hbs index 4391f1e4ce..9235779ffc 100644 --- a/app/components/gh-members-payments-setting.hbs +++ b/app/components/gh-members-payments-setting.hbs @@ -52,7 +52,7 @@ {{else}} - {{#if this.stripeConnectAccountId}} + {{#if (and this.stripeConnectAccountId (not this.saveStripeSettings.isRunning))}}
    {{svg-jar "check-circle-stroke" class="check-circle"}}

    You are connected to Stripe

    diff --git a/app/components/gh-members-payments-setting.js b/app/components/gh-members-payments-setting.js index 3b54b5eb29..25841b8a3e 100644 --- a/app/components/gh-members-payments-setting.js +++ b/app/components/gh-members-payments-setting.js @@ -3,13 +3,14 @@ import {computed} from '@ember/object'; import {currencies} from 'ghost-admin/utils/currency'; import {reads} from '@ember/object/computed'; import {inject as service} from '@ember/service'; -import {task} from 'ember-concurrency'; +import {task, timeout} from 'ember-concurrency'; export default Component.extend({ config: service(), ghostPaths: service(), ajax: service(), settings: service(), + store: service(), topCurrencies: null, currencies: null, @@ -227,14 +228,77 @@ export default Component.extend({ yield this.settings.reload(); }), + calculateDiscount(monthly, yearly) { + if (isNaN(monthly) || isNaN(yearly)) { + return 0; + } + + return monthly ? 100 - Math.floor((yearly / 12 * 100) / monthly) : 0; + }, + + getActivePrice(prices, interval, amount, currency) { + return prices.find((price) => { + return ( + price.active && price.amount === amount && price.type === 'recurring' && + price.interval === interval && price.currency.toLowerCase() === currency.toLowerCase() + ); + }); + }, + + updatePortalPlans(monthlyPriceId, yearlyPriceId) { + let portalPlans = ['free']; + if (monthlyPriceId) { + portalPlans.push(monthlyPriceId); + } + if (yearlyPriceId) { + portalPlans.push(yearlyPriceId); + } + this.settings.set('portalPlans', portalPlans); + }, + saveStripeSettings: task(function* () { this.set('stripeConnectError', null); this.set('stripeConnectSuccess', null); if (this.get('settings.stripeConnectIntegrationToken')) { try { - const response = yield this.settings.save(); - this.set('membersStripeOpen', false); - this.set('stripeConnectSuccess', true); + let response = yield this.settings.save(); + const products = yield this.store.query('product', {include: 'stripe_prices'}); + this.product = products.firstObject; + if (this.product) { + const stripePrices = this.product.stripePrices || []; + const yearlyDiscount = this.calculateDiscount(5, 50); + stripePrices.push( + { + nickname: 'Monthly', + amount: 500, + active: 1, + description: 'Full access', + currency: 'usd', + interval: 'month', + type: 'recurring' + }, + { + nickname: 'Yearly', + amount: 5000, + active: 1, + currency: 'usd', + description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access', + interval: 'year', + type: 'recurring' + } + ); + this.product.set('stripePrices', stripePrices); + yield timeout(1000); + const updatedProduct = yield this.product.save(); + const monthlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'month', 500, 'usd'); + const yearlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'year', 5000, 'usd'); + this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id); + this.settings.set('membersMonthlyPriceId', monthlyPrice.id); + this.settings.set('membersYearlyPriceId', yearlyPrice.id); + response = yield this.settings.save(); + this.set('membersStripeOpen', false); + this.set('stripeConnectSuccess', true); + } return response; } catch (error) { if (error.payload && error.payload.errors) { From 3dc26c4796601d7ce9cb878347164a99962331d1 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Thu, 20 May 2021 21:23:38 +0530 Subject: [PATCH 0347/3032] Added default price creation on launch wizard no refs On Stripe connect in launch wizard, we add the default prices on the new Stripe account in the DB so the site has prices in Portal checked from the start. It behaves the same way as connecting stripe from membership settings. --- .../gh-launch-wizard/connect-stripe.hbs | 6 +- .../gh-launch-wizard/connect-stripe.js | 66 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/app/components/gh-launch-wizard/connect-stripe.hbs b/app/components/gh-launch-wizard/connect-stripe.hbs index 739ef0847b..5b190bb53f 100644 --- a/app/components/gh-launch-wizard/connect-stripe.hbs +++ b/app/components/gh-launch-wizard/connect-stripe.hbs @@ -102,7 +102,11 @@ @class="w-70 ml4 right gh-btn gh-btn-black gh-btn-large gh-btn-icon-right" data-test-button="wizard-next" > - {{if this.settings.stripeConnectAccountId "Continue" "Save and continue"}}{{svg-jar "arrow-right-tail"}} + {{#if this.saveAndContinueTask.isRunning}} + Saving... + {{else}} + {{if this.settings.stripeConnectAccountId "Continue" "Save and continue"}}{{svg-jar "arrow-right-tail"}} + {{/if}}
    diff --git a/app/components/gh-launch-wizard/connect-stripe.js b/app/components/gh-launch-wizard/connect-stripe.js index 6d394ebe83..0151786024 100644 --- a/app/components/gh-launch-wizard/connect-stripe.js +++ b/app/components/gh-launch-wizard/connect-stripe.js @@ -10,6 +10,7 @@ export default class GhLaunchWizardConnectStripeComponent extends Component { @service config; @service ghostPaths; @service settings; + @service store; @tracked hasActiveStripeSubscriptions = false; @tracked showDisconnectStripeConnectModal = false; @@ -59,6 +60,34 @@ export default class GhLaunchWizardConnectStripeComponent extends Component { this.stripeConnectError = null; } + calculateDiscount(monthly, yearly) { + if (isNaN(monthly) || isNaN(yearly)) { + return 0; + } + + return monthly ? 100 - Math.floor((yearly / 12 * 100) / monthly) : 0; + } + + getActivePrice(prices, interval, amount, currency) { + return prices.find((price) => { + return ( + price.active && price.amount === amount && price.type === 'recurring' && + price.interval === interval && price.currency.toLowerCase() === currency.toLowerCase() + ); + }); + } + + updatePortalPlans(monthlyPriceId, yearlyPriceId) { + let portalPlans = ['free']; + if (monthlyPriceId) { + portalPlans.push(monthlyPriceId); + } + if (yearlyPriceId) { + portalPlans.push(yearlyPriceId); + } + this.settings.set('portalPlans', portalPlans); + } + @task({drop: true}) *openDisconnectStripeConnectModalTask() { this.hasActiveStripeSubscriptions = false; @@ -114,6 +143,43 @@ export default class GhLaunchWizardConnectStripeComponent extends Component { try { yield this.settings.save(); + + const products = yield this.store.query('product', {include: 'stripe_prices'}); + this.product = products.firstObject; + if (this.product) { + const stripePrices = this.product.stripePrices || []; + const yearlyDiscount = this.calculateDiscount(5, 50); + stripePrices.push( + { + nickname: 'Monthly', + amount: 500, + active: 1, + description: 'Full access', + currency: 'usd', + interval: 'month', + type: 'recurring' + }, + { + nickname: 'Yearly', + amount: 5000, + active: 1, + currency: 'usd', + description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access', + interval: 'year', + type: 'recurring' + } + ); + this.product.set('stripePrices', stripePrices); + yield timeout(1000); + const updatedProduct = yield this.product.save(); + const monthlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'month', 500, 'usd'); + const yearlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'year', 5000, 'usd'); + this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id); + this.settings.set('membersMonthlyPriceId', monthlyPrice.id); + this.settings.set('membersYearlyPriceId', yearlyPrice.id); + yield this.settings.save(); + } + this.pauseAndContinueTask.perform(); return true; } catch (error) { From 5063bc88c73c3897bc633a7c57f5503b89f3de83 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Thu, 20 May 2021 21:37:03 +0530 Subject: [PATCH 0348/3032] Cleaned default prices on stripe connect no refs Cleans up changes to create prices on stripe connect with increase in timeout to allow stripe migrations to run in backend --- app/components/gh-members-payments-setting.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/gh-members-payments-setting.js b/app/components/gh-members-payments-setting.js index 25841b8a3e..cddc650b2f 100644 --- a/app/components/gh-members-payments-setting.js +++ b/app/components/gh-members-payments-setting.js @@ -288,7 +288,7 @@ export default Component.extend({ } ); this.product.set('stripePrices', stripePrices); - yield timeout(1000); + yield timeout(3000); const updatedProduct = yield this.product.save(); const monthlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'month', 500, 'usd'); const yearlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'year', 5000, 'usd'); @@ -296,9 +296,9 @@ export default Component.extend({ this.settings.set('membersMonthlyPriceId', monthlyPrice.id); this.settings.set('membersYearlyPriceId', yearlyPrice.id); response = yield this.settings.save(); - this.set('membersStripeOpen', false); - this.set('stripeConnectSuccess', true); } + this.set('membersStripeOpen', false); + this.set('stripeConnectSuccess', true); return response; } catch (error) { if (error.payload && error.payload.errors) { From 4f70e84536cd5bbe67b7521be85426d22aac32d9 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 20 May 2021 17:20:49 +0100 Subject: [PATCH 0349/3032] Fixed stripe connect modal not adjusting correctly to connected state no issue - updated `` to pass `@modifier` and `@updateModifier` through to child modal components so they can adjust their own classes - added an `updateSuccessModifier()` action to `` to set the modal size when first opening and on `@onConnected/Disconnected` actions passed to the `` component - updated `` to call passed in `onConnected/Disconnected` actions when connection or disconnection is finalised --- app/components/gh-fullscreen-modal.hbs | 2 ++ app/components/gh-members-payments-setting.js | 7 +++++++ app/components/modal-stripe-connect.hbs | 4 +++- app/components/modal-stripe-connect.js | 13 +++++++++++++ app/templates/settings/membership.hbs | 2 +- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/components/gh-fullscreen-modal.hbs b/app/components/gh-fullscreen-modal.hbs index 56f6d17115..fe9b246576 100644 --- a/app/components/gh-fullscreen-modal.hbs +++ b/app/components/gh-fullscreen-modal.hbs @@ -9,6 +9,8 @@ @model={{this.model}} @confirm={{action "confirm"}} @closeModal={{action "close"}} + @modifier={{this.modifier}} + @updateModifier={{action (mut this.modifier)}} /> {{/let}} {{/if}} diff --git a/app/components/gh-members-payments-setting.js b/app/components/gh-members-payments-setting.js index cddc650b2f..e7ce1c8820 100644 --- a/app/components/gh-members-payments-setting.js +++ b/app/components/gh-members-payments-setting.js @@ -226,6 +226,8 @@ export default Component.extend({ yield this.ajax.delete(url); yield this.settings.reload(); + + this.onDisconnected?.(); }), calculateDiscount(monthly, yearly) { @@ -262,8 +264,10 @@ export default Component.extend({ if (this.get('settings.stripeConnectIntegrationToken')) { try { let response = yield this.settings.save(); + const products = yield this.store.query('product', {include: 'stripe_prices'}); this.product = products.firstObject; + if (this.product) { const stripePrices = this.product.stripePrices || []; const yearlyDiscount = this.calculateDiscount(5, 50); @@ -297,8 +301,11 @@ export default Component.extend({ this.settings.set('membersYearlyPriceId', yearlyPrice.id); response = yield this.settings.save(); } + this.set('membersStripeOpen', false); this.set('stripeConnectSuccess', true); + this.onConnected?.(); + return response; } catch (error) { if (error.payload && error.payload.errors) { diff --git a/app/components/modal-stripe-connect.hbs b/app/components/modal-stripe-connect.hbs index f7900792e0..eaa3816469 100644 --- a/app/components/modal-stripe-connect.hbs +++ b/app/components/modal-stripe-connect.hbs @@ -8,9 +8,11 @@
    -
    From 33a8b34c41ba08a66d8b7ed7679930401857b1b7 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 21 May 2021 08:59:29 +0100 Subject: [PATCH 0353/3032] Commented out temporarily unused products routes no issue - support for multiple products is not ready yet so the routes should not be available whilst we still have a singular monthly/yearly prices on top of the in-progress products work --- app/router.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/router.js b/app/router.js index aae59622e2..17ddd8760f 100644 --- a/app/router.js +++ b/app/router.js @@ -52,9 +52,9 @@ Router.map(function () { this.route('settings.members-email', {path: '/settings/members-email'}); this.route('settings.code-injection', {path: '/settings/code-injection'}); - this.route('settings.products', {path: '/settings/products'}); - this.route('settings.product.new', {path: '/settings/product/new'}); - this.route('settings.product', {path: '/settings/product/:product_id'}); + // this.route('settings.products', {path: '/settings/products'}); + // this.route('settings.product.new', {path: '/settings/product/new'}); + // this.route('settings.product', {path: '/settings/product/:product_id'}); this.route('settings.theme', {path: '/settings/theme'}, function () { this.route('uploadtheme'); From f39cade391991fec4bcb5e6d80cc9ca466ad059d Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Fri, 21 May 2021 11:25:23 +0200 Subject: [PATCH 0354/3032] Fixed price selector clipping bug in membership settings --- app/styles/patterns/forms.css | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/styles/patterns/forms.css b/app/styles/patterns/forms.css index 5646ad8d6d..df6fa04ec1 100644 --- a/app/styles/patterns/forms.css +++ b/app/styles/patterns/forms.css @@ -647,7 +647,7 @@ textarea { border-right: none; border-top-right-radius: 0; border-bottom-right-radius: 0; - padding-right: 0; + padding-right: 2px; min-width: 0; /* Firefox fix */ } @@ -678,6 +678,12 @@ textarea { color: var(--midlightgrey); } +@media (max-width: 430px) { + .gh-input-append { + padding: 6px 8px; + } +} + .gh-expandable-content .gh-input-append { border-color: var(--whitegrey-d1); } From 08c0cf8ec11ff4af8c7615a91b4cfbd25d45b61e Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Fri, 21 May 2021 14:52:09 +0200 Subject: [PATCH 0355/3032] Fixed responsive issues in membership settings --- app/styles/layouts/settings.css | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 5318388d07..9b0e2b5450 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1412,7 +1412,7 @@ p.theme-validation-details { grid-gap: 32px; } -@media (max-width: 1260px) { +@media (max-width: 1320px) { .gh-setting-members-basics { grid-gap: 0; } @@ -1455,6 +1455,11 @@ p.theme-validation-details { } } +.gh-setting-members-portalcta .gh-expandable-description { + padding-top: 2px; + line-height: 1.4; +} + .gh-setting-members-access { margin-bottom: 30px; } @@ -1504,6 +1509,11 @@ p.theme-validation-details { margin: 1.6rem 2.4rem 1.6rem 1rem; } +.gh-setting-dropdown-list { + margin-top: -1px; + border-top: 1px solid var(--input-border-color) !important; +} + .gh-setting-dropdown-list .ember-power-select-option { padding: 6px 8px; } From ba44291b7002f877c3e2366b305f48b463724190 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 21 May 2021 17:53:29 +0100 Subject: [PATCH 0356/3032] Fixed default email recipients when visibility is `members` or `paid` no issue - since we reverted the post visibility changes, the visibility filter passed to `` was passing through `'members'` or `'paid'` which aren't known values --- app/components/gh-publishmenu.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/components/gh-publishmenu.js b/app/components/gh-publishmenu.js index 92bc1ccdcb..dd58a5d6b2 100644 --- a/app/components/gh-publishmenu.js +++ b/app/components/gh-publishmenu.js @@ -147,6 +147,14 @@ export default Component.extend({ return 'status:free,status:-free'; } + if (this.post.visibility === 'members') { + return 'status:free,status:-free'; + } + + if (this.post.visibility === 'paid') { + return 'status:-free'; + } + return this.post.visibility; } From 5d9b0d1975a5b402ebc29d3fa71db3513b32cafe Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Fri, 21 May 2021 18:22:01 +0100 Subject: [PATCH 0357/3032] Brought checkboxes back to publish menu recipient selection (#1972) no issue Free and Paid are by far the two most common options for email recipients so it makes more sense to have them as very clear options which we felt was not the case with the single token/segment select. - created a new `` component that has individual checkboxes for free/paid/segment and when segment is selected an additional token input for specific labels - updated draft and scheduled publish menu components to use the `` Co-authored-by: Sanne de Vries --- .../gh-members-recipient-select.hbs | 69 +++++++ app/components/gh-members-recipient-select.js | 168 ++++++++++++++++++ app/components/gh-publishmenu-draft.hbs | 9 +- app/components/gh-publishmenu-scheduled.hbs | 6 +- app/components/gh-publishmenu.hbs | 4 +- app/services/members-utils.js | 4 + app/styles/components/power-select.css | 4 + app/styles/components/publishmenu.css | 2 +- app/styles/patterns/forms.css | 14 ++ app/utils/flatten-grouped-options.js | 15 ++ package.json | 1 + yarn.lock | 25 ++- 12 files changed, 302 insertions(+), 19 deletions(-) create mode 100644 app/components/gh-members-recipient-select.hbs create mode 100644 app/components/gh-members-recipient-select.js create mode 100644 app/utils/flatten-grouped-options.js diff --git a/app/components/gh-members-recipient-select.hbs b/app/components/gh-members-recipient-select.hbs new file mode 100644 index 0000000000..12f9fa1b7a --- /dev/null +++ b/app/components/gh-members-recipient-select.hbs @@ -0,0 +1,69 @@ +
    +

    Free members {{this.freeMemberCountLabel}}

    +
    + +
    +
    +{{#if this.isPaidAvailable}} +
    +

    Paid members {{this.paidMemberCountLabel}}

    +
    + +
    +
    +{{/if}} +{{#if this.specificOptions}} +
    +

    Specific people

    +
    + +
    +
    + {{#if this.isSpecificChecked}} + + {{option.name}} + + {{/if}} +{{/if}} \ No newline at end of file diff --git a/app/components/gh-members-recipient-select.js b/app/components/gh-members-recipient-select.js new file mode 100644 index 0000000000..638cd2ef55 --- /dev/null +++ b/app/components/gh-members-recipient-select.js @@ -0,0 +1,168 @@ +import Component from '@glimmer/component'; +import flattenGroupedOptions from 'ghost-admin/utils/flatten-grouped-options'; +import {Promise} from 'rsvp'; +import {TrackedSet} from 'tracked-built-ins'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; + +const BASE_FILTERS = ['status:free', 'status:-free']; + +export default class GhMembersRecipientSelect extends Component { + @service membersUtils; + @service session; + @service store; + + baseFilters = new TrackedSet(); + specificFilters = new TrackedSet(); + + @tracked isSpecificChecked = false; + @tracked specificOptions = []; + @tracked freeMemberCount; + @tracked paidMemberCount; + + constructor() { + super(...arguments); + + this.fetchSpecificOptionsTask.perform(); + this.fetchMemberCountsTask.perform(); + + this.baseFilters.clear(); + this.specificFilters.clear(); + + (this.args.filter || '').split(',').forEach((filter) => { + if (filter?.trim()) { + if (BASE_FILTERS.includes(filter)) { + this.baseFilters.add(filter); + } else { + this.isSpecificChecked = true; + this.specificFilters.add(filter); + } + } + }); + } + + get isPaidAvailable() { + return this.membersUtils.isStripeEnabled; + } + + get isFreeChecked() { + return this.baseFilters.has('status:free'); + } + + get isPaidChecked() { + return this.baseFilters.has('status:-free'); + } + + get selectedSpecificOptions() { + return flattenGroupedOptions(this.specificOptions) + .filter(o => this.specificFilters.has(o.segment)); + } + + get freeMemberCountLabel() { + if (this.freeMemberCount !== undefined) { + return `(${this.freeMemberCount})`; + } + return ''; + } + + get paidMemberCountLabel() { + if (this.paidMemberCount !== undefined) { + return `(${this.paidMemberCount})`; + } + return ''; + } + + get filterString() { + const selectedFilters = !this.isSpecificChecked ? + new Set([...this.baseFilters.values()]) : + new Set([...this.baseFilters.values(), ...this.specificFilters.values()]); + + if (!this.isPaidAvailable) { + selectedFilters.delete('status:-free'); + } + + return Array.from(selectedFilters).join(',') || null; + } + + @action + toggleFilter(filter, event) { + event?.preventDefault(); + if (this.args.disabled) { + return; + } + this.baseFilters.has(filter) ? this.baseFilters.delete(filter) : this.baseFilters.add(filter); + this.args.onChange?.(this.filterString); + } + + @action + toggleSpecificFilter(event) { + event?.preventDefault(); + if (this.args.disabled) { + return; + } + this.isSpecificChecked = !this.isSpecificChecked; + this.args.onChange?.(this.filterString); + } + + @action + selectSpecificOptions(selectedOptions) { + if (this.args.disabled) { + return; + } + this.specificFilters.clear(); + selectedOptions.forEach(o => this.specificFilters.add(o.segment)); + + if (this.isSpecificChecked) { + this.args.onChange?.(this.filterString); + } + } + + @task + *fetchSpecificOptionsTask() { + const options = []; + + // fetch all labels w̶i̶t̶h̶ c̶o̶u̶n̶t̶s̶ + // TODO: add `include: 'count.members` to query once API is fixed + const labels = yield this.store.query('label', {limit: 'all'}); + + if (labels.length > 0) { + const labelsGroup = { + groupName: 'Labels', + options: [] + }; + + labels.forEach((label) => { + labelsGroup.options.push({ + name: label.name, + segment: `label:${label.slug}`, + count: label.count?.members, + class: 'segment-label' + }); + }); + + options.push(labelsGroup); + } + + this.specificOptions = options; + } + + @task + *fetchMemberCountsTask() { + const user = yield this.session.user; + + if (!user.isOwnerOrAdmin) { + return; + } + + yield Promise.all([ + this.store.query('member', {filter: 'status:free', limit: 1}).then((res) => { + this.freeMemberCount = res.meta.pagination.total; + }), + this.store.query('member', {filter: 'status:-free', limit: 1}).then((res) => { + this.paidMemberCount = res.meta.pagination.total; + }) + ]); + } +} diff --git a/app/components/gh-publishmenu-draft.hbs b/app/components/gh-publishmenu-draft.hbs index 4923e0b799..8f062fa5db 100644 --- a/app/components/gh-publishmenu-draft.hbs +++ b/app/components/gh-publishmenu-draft.hbs @@ -36,15 +36,12 @@

    {{html-safe this.sendingEmailLimitError}}

    {{else}}
    - +
    -
    diff --git a/app/components/gh-publishmenu-scheduled.hbs b/app/components/gh-publishmenu-scheduled.hbs index f9463fa108..db3a951da3 100644 --- a/app/components/gh-publishmenu-scheduled.hbs +++ b/app/components/gh-publishmenu-scheduled.hbs @@ -38,11 +38,9 @@
    -
    diff --git a/app/components/gh-publishmenu.hbs b/app/components/gh-publishmenu.hbs index e14b4954e3..575416478e 100644 --- a/app/components/gh-publishmenu.hbs +++ b/app/components/gh-publishmenu.hbs @@ -16,7 +16,7 @@ @saveType={{this.saveType}} @isClosing={{this.isClosing}} @canSendEmail={{this.canSendEmail}} - @recipientsSegment={{this.sendEmailWhenPublished}} + @recipientsFilter={{this.sendEmailWhenPublished}} @setSaveType={{action "setSaveType"}} @setTypedDateError={{action (mut this.typedDateError)}} @isSendingEmailLimited={{this.isSendingEmailLimited}} @@ -29,7 +29,7 @@ @setSaveType={{action "setSaveType"}} @setTypedDateError={{action (mut this.typedDateError)}} @canSendEmail={{this.canSendEmail}} - @recipientsSegment={{this.sendEmailWhenPublished}} + @recipientsFilter={{this.sendEmailWhenPublished}} @updateMemberCount={{action "updateMemberCount"}} @setSendEmailWhenPublished={{action "setSendEmailWhenPublished"}} @isSendingEmailLimited={{this.isSendingEmailLimited}} diff --git a/app/services/members-utils.js b/app/services/members-utils.js index a8b2734bfb..f86d0270e3 100644 --- a/app/services/members-utils.js +++ b/app/services/members-utils.js @@ -4,6 +4,10 @@ export default class MembersUtilsService extends Service { @service config; @service settings; + get isMembersEnabled() { + return this.settings.get('membersSignupAccess') !== 'none'; + } + get isStripeEnabled() { const stripeDirect = this.config.get('stripeDirect'); diff --git a/app/styles/components/power-select.css b/app/styles/components/power-select.css index 1531d63fc1..185d574128 100644 --- a/app/styles/components/power-select.css +++ b/app/styles/components/power-select.css @@ -137,6 +137,10 @@ } } +.ember-power-select-options .ember-power-select-group:first-child .ember-power-select-group-name { + border-top: none; +} + .ember-power-select-group:first-of-type .ember-power-select-group-name { margin: 8px 0; padding-top: 0; diff --git a/app/styles/components/publishmenu.css b/app/styles/components/publishmenu.css index bc95680582..3f91e8af84 100644 --- a/app/styles/components/publishmenu.css +++ b/app/styles/components/publishmenu.css @@ -268,7 +268,7 @@ display: flex; align-items: center; justify-content: space-between; - margin-bottom: 10px; + margin-bottom: 8px; } .gh-publishmenu-send-to-option p { diff --git a/app/styles/patterns/forms.css b/app/styles/patterns/forms.css index df6fa04ec1..b37e70ceaa 100644 --- a/app/styles/patterns/forms.css +++ b/app/styles/patterns/forms.css @@ -557,6 +557,20 @@ textarea { transform: translateX(16px); } +.for-switch.x-small .input-toggle-component { + width: 34px !important; + height: 20px !important; +} + +.for-switch.x-small .input-toggle-component:before { + height: 16px !important; + width: 16px !important; +} + +.for-switch.x-small input:checked + .input-toggle-component:before { + transform: translateX(14px); +} + .for-switch.disabled { opacity: 0.5; pointer-events: none; diff --git a/app/utils/flatten-grouped-options.js b/app/utils/flatten-grouped-options.js new file mode 100644 index 0000000000..578951da69 --- /dev/null +++ b/app/utils/flatten-grouped-options.js @@ -0,0 +1,15 @@ +export default function flattenGroupedOptions(options) { + const flatOptions = []; + + function getOptions(option) { + if (option.options) { + return option.options.forEach(getOptions); + } + + flatOptions.push(option); + } + + options.forEach(getOptions); + + return flatOptions; +} diff --git a/package.json b/package.json index 20fa43ddd0..8bc892b45e 100644 --- a/package.json +++ b/package.json @@ -134,6 +134,7 @@ "simplemde": "https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost", "testem": "3.4.1", "top-gh-contribs": "2.0.4", + "tracked-built-ins": "^1.1.1", "validator": "7.2.0", "walk-sync": "2.2.0" }, diff --git a/yarn.lock b/yarn.lock index f27ee603af..bc830e6a6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1533,7 +1533,7 @@ handlebars "^4.0.13" simple-html-tokenizer "^0.5.8" -"@glimmer/tracking@^1.0.2", "@glimmer/tracking@^1.0.4": +"@glimmer/tracking@^1.0.0", "@glimmer/tracking@^1.0.2", "@glimmer/tracking@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@glimmer/tracking/-/tracking-1.0.4.tgz#f1bc1412fe5e2236d0f8d502994a8f88af1bbb21" integrity sha512-F+oT8I55ba2puSGIzInmVrv/8QA2PcK1VD+GWgFMhF6WC97D+uZX7BFg+a3s/2N4FVBq5KHE+QxZzgazM151Yw== @@ -5728,7 +5728,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.26.6, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.4, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@7.26.6, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.4, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -6693,7 +6693,6 @@ ember-power-calendar@^0.16.3: ember-power-datepicker@cibernox/ember-power-datepicker: version "0.8.1" - uid da580474a2c449b715444934ddb626b7c07f46a7 resolved "https://codeload.github.com/cibernox/ember-power-datepicker/tar.gz/da580474a2c449b715444934ddb626b7c07f46a7" dependencies: ember-basic-dropdown "^3.0.11" @@ -8478,7 +8477,6 @@ gonzales-pe@4.2.4: "google-caja-bower@https://github.com/acburdine/google-caja-bower#ghost": version "6011.0.0" - uid "275cb75249f038492094a499756a73719ae071fd" resolved "https://github.com/acburdine/google-caja-bower#275cb75249f038492094a499756a73719ae071fd" got@^8.0.1: @@ -9818,7 +9816,6 @@ just-extend@^4.0.2: "keymaster@https://github.com/madrobby/keymaster.git": version "1.6.3" - uid f8f43ddafad663b505dc0908e72853bcf8daea49 resolved "https://github.com/madrobby/keymaster.git#f8f43ddafad663b505dc0908e72853bcf8daea49" keyv@3.0.0: @@ -13156,7 +13153,6 @@ simple-swizzle@^0.2.2: "simplemde@https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost": version "1.11.2" - uid "4c39702de7d97f9b32d5c101f39237b6dab7c3ee" resolved "https://github.com/kevinansfield/simplemde-markdown-editor.git#4c39702de7d97f9b32d5c101f39237b6dab7c3ee" sinon@^9.0.0: @@ -14119,6 +14115,23 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" +tracked-built-ins@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tracked-built-ins/-/tracked-built-ins-1.1.1.tgz#d472142b268f2e03de719e33c0407b4c8b8ce5fa" + integrity sha512-ZPGvTu+7d2tkUe4fJPgKkW8Bh512ZBih1S+DhuCSuT4VGj5qLwKbabSMqRiPSYOwWeM5aER0HMRGUvpWARPaHQ== + dependencies: + ember-cli-babel "^7.26.3" + ember-cli-typescript "^4.1.0" + tracked-maps-and-sets "^2.0.0" + +tracked-maps-and-sets@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tracked-maps-and-sets/-/tracked-maps-and-sets-2.2.1.tgz#323dd40540c561e8b0ffdec8bf129c68ec5025f9" + integrity sha512-XYrXh6L/GpGmVmG3KcN/qoDyi4FxHh8eZY/BA/RuoxynskV+GZSfwrX3R+5DR2CIkzkCx4zi4kkDRg1AMDfDhg== + dependencies: + "@glimmer/tracking" "^1.0.0" + ember-cli-babel "^7.17.2" + tree-sync@^1.2.2: version "1.4.0" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6" From fbd2dec6d2884522dadee8c88bab0aad37d5f2ad Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 18:23:08 +0100 Subject: [PATCH 0358/3032] Pin dependency tracked-built-ins to 1.1.1 (#1973) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8bc892b45e..0b61493183 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "simplemde": "https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost", "testem": "3.4.1", "top-gh-contribs": "2.0.4", - "tracked-built-ins": "^1.1.1", + "tracked-built-ins": "1.1.1", "validator": "7.2.0", "walk-sync": "2.2.0" }, diff --git a/yarn.lock b/yarn.lock index bc830e6a6a..d45d6431c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14115,7 +14115,7 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" -tracked-built-ins@^1.1.1: +tracked-built-ins@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/tracked-built-ins/-/tracked-built-ins-1.1.1.tgz#d472142b268f2e03de719e33c0407b4c8b8ce5fa" integrity sha512-ZPGvTu+7d2tkUe4fJPgKkW8Bh512ZBih1S+DhuCSuT4VGj5qLwKbabSMqRiPSYOwWeM5aER0HMRGUvpWARPaHQ== From 01d4eaffadf6bc5efc90e57d42f834388744d327 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 May 2021 01:11:19 +0000 Subject: [PATCH 0359/3032] Update dependency eslint to v7.27.0 --- package.json | 2 +- yarn.lock | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 0b61493183..8da7382c0d 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "ember-truth-helpers": "3.0.0", "ember-useragent": "0.10.0", "emberx-file-input": "1.2.1", - "eslint": "7.26.0", + "eslint": "7.27.0", "eslint-plugin-ghost": "2.2.0", "faker": "5.5.3", "fs-extra": "10.0.0", diff --git a/yarn.lock b/yarn.lock index d45d6431c3..d92d126466 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7258,10 +7258,10 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@7.26.0: - version "7.26.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.26.0.tgz#d416fdcdcb3236cd8f282065312813f8c13982f6" - integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== +eslint@7.27.0: + version "7.27.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.27.0.tgz#665a1506d8f95655c9274d84bd78f7166b07e9c7" + integrity sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA== dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.4.1" @@ -7271,12 +7271,14 @@ eslint@7.26.0: debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" esquery "^1.4.0" esutils "^2.0.2" + fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" @@ -7288,7 +7290,7 @@ eslint@7.26.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.21" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -7297,7 +7299,7 @@ eslint@7.26.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.4" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -7693,7 +7695,7 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -13814,7 +13816,7 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -table@^6.0.4: +table@^6.0.9: version "6.7.1" resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== From 0d7e86ffde60fd263f0025fb135400fadf81065b Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 24 May 2021 11:02:26 +0100 Subject: [PATCH 0360/3032] Added timeout to help prevent site background flashes in portal previews refs https://github.com/TryGhost/Team/issues/701 - `onload` event fires once the page has loaded but scripts may still be processing that would render an overlay. Wait for 100ms for renders to occur before making the iframe contents visible to allow for renders to occur --- app/components/gh-site-iframe.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/components/gh-site-iframe.js b/app/components/gh-site-iframe.js index d92ff418f5..7f3a7e384a 100644 --- a/app/components/gh-site-iframe.js +++ b/app/components/gh-site-iframe.js @@ -1,6 +1,8 @@ import Component from '@glimmer/component'; import {action} from '@ember/object'; import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {timeout} from 'ember-concurrency'; import {tracked} from '@glimmer/tracking'; export default class GhSiteIframeComponent extends Component { @@ -39,8 +41,16 @@ export default class GhSiteIframeComponent extends Component { @action onLoad(event) { if (this.args.invisibleUntilLoaded) { - this.isInvisible = false; + this.makeVisible.perform(); } this.args.onLoad?.(event); } + + @task + *makeVisible() { + // give any scripts a bit of time to render before making visible + // allows portal to render it's overlay and prevent site background flashes + yield timeout(100); + this.isInvisible = false; + } } From 4c965dbbb30fecdb2a3f5d63eeb4787be94080f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 22:07:48 +1200 Subject: [PATCH 0361/3032] Fixed indescribable error in theme limit refs https://github.com/TryGhost/Utils/commit/f51c640fb04f6742dabb1328ed46910aa954cc5b - This should not affect any of the current code but should improve edge case errors related to "allowlist" types of limits --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 8da7382c0d..3bf68b2883 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@tryghost/helpers": "1.1.45", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", - "@tryghost/limit-service": "0.5.0", + "@tryghost/limit-service": "0.6.0", "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/string": "0.1.19", diff --git a/yarn.lock b/yarn.lock index d92d126466..b26bcfa8f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1670,10 +1670,10 @@ dependencies: "@tryghost/kg-clean-basic-html" "^1.0.17" -"@tryghost/limit-service@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-0.5.0.tgz#b69eb70cd7e5d5b559b099be9dc8ea7dec854a59" - integrity sha512-a2ai5WS7I+jWHYObVBn9NusQ0FAIwWkjYJoMpoaSGXDBAynaeLkf+uAT/86PGpuUcDFWvvBl4m79K/lSds5adw== +"@tryghost/limit-service@0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-0.6.0.tgz#f7167ad9e69bd8935369057f1639fa079252f0b6" + integrity sha512-v7MnEMWGcFbllcmpYSbyAk3xNoqszFHAWm4SsN5CDMLju/ZNVvH9mL9Yzyv+5e4r1f8E/BZkd6gE0j7C1vijtQ== dependencies: lodash "^4.17.21" luxon "^1.26.0" From 6a286fd0866afa41137292f80b43df46c83c5fcb Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 24 May 2021 14:02:43 +0530 Subject: [PATCH 0362/3032] Handled product save failure on Stripe connect refs https://github.com/TryGhost/Team/issues/704 We try and create new default prices soon after Stripe Connect is completed, but it might take couple of seconds for backend to have Stripe config ready and in the meanwhile saving a product with new prices will fail with 409 Conflict error as it will be unable to create prices on Stripe. This change allows re-attempting saving a product with new prices soon after connect in case of a STRIPE_NOT_CONFIGURED error so that the default prices can be created properly. --- .../gh-launch-wizard/connect-stripe.js | 28 +++++++++++++++++-- app/components/gh-members-payments-setting.js | 27 ++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/app/components/gh-launch-wizard/connect-stripe.js b/app/components/gh-launch-wizard/connect-stripe.js index 0151786024..984d90d9b8 100644 --- a/app/components/gh-launch-wizard/connect-stripe.js +++ b/app/components/gh-launch-wizard/connect-stripe.js @@ -5,6 +5,9 @@ import {task} from 'ember-concurrency-decorators'; import {timeout} from 'ember-concurrency'; import {tracked} from '@glimmer/tracking'; +const RETRY_PRODUCT_SAVE_POLL_LENGTH = 1000; +const RETRY_PRODUCT_SAVE_MAX_POLL = 15 * RETRY_PRODUCT_SAVE_POLL_LENGTH; + export default class GhLaunchWizardConnectStripeComponent extends Component { @service ajax; @service config; @@ -88,6 +91,28 @@ export default class GhLaunchWizardConnectStripeComponent extends Component { this.settings.set('portalPlans', portalPlans); } + @task({drop: true}) + *saveProduct() { + let pollTimeout = 0; + while (pollTimeout < RETRY_PRODUCT_SAVE_MAX_POLL) { + yield timeout(RETRY_PRODUCT_SAVE_POLL_LENGTH); + + try { + const updatedProduct = yield this.product.save(); + return updatedProduct; + } catch (error) { + if (error.payload?.errors && error.payload.errors[0].code === 'STRIPE_NOT_CONFIGURED') { + pollTimeout += RETRY_PRODUCT_SAVE_POLL_LENGTH; + // no-op: will try saving again as stripe is not ready + continue; + } else { + throw error; + } + } + } + return this.product; + } + @task({drop: true}) *openDisconnectStripeConnectModalTask() { this.hasActiveStripeSubscriptions = false; @@ -170,8 +195,7 @@ export default class GhLaunchWizardConnectStripeComponent extends Component { } ); this.product.set('stripePrices', stripePrices); - yield timeout(1000); - const updatedProduct = yield this.product.save(); + const updatedProduct = yield this.saveProduct.perform(); const monthlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'month', 500, 'usd'); const yearlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'year', 5000, 'usd'); this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id); diff --git a/app/components/gh-members-payments-setting.js b/app/components/gh-members-payments-setting.js index e7ce1c8820..eb51dfe30a 100644 --- a/app/components/gh-members-payments-setting.js +++ b/app/components/gh-members-payments-setting.js @@ -5,6 +5,9 @@ import {reads} from '@ember/object/computed'; import {inject as service} from '@ember/service'; import {task, timeout} from 'ember-concurrency'; +const RETRY_PRODUCT_SAVE_POLL_LENGTH = 1000; +const RETRY_PRODUCT_SAVE_MAX_POLL = 15 * RETRY_PRODUCT_SAVE_POLL_LENGTH; + export default Component.extend({ config: service(), ghostPaths: service(), @@ -258,6 +261,27 @@ export default Component.extend({ this.settings.set('portalPlans', portalPlans); }, + saveProduct: task(function* () { + let pollTimeout = 0; + while (pollTimeout < RETRY_PRODUCT_SAVE_MAX_POLL) { + yield timeout(RETRY_PRODUCT_SAVE_POLL_LENGTH); + + try { + const updatedProduct = yield this.product.save(); + return updatedProduct; + } catch (error) { + if (error.payload?.errors && error.payload.errors[0].code === 'STRIPE_NOT_CONFIGURED') { + pollTimeout += RETRY_PRODUCT_SAVE_POLL_LENGTH; + // no-op: will try saving again as stripe is not ready + continue; + } else { + throw error; + } + } + } + return this.product; + }), + saveStripeSettings: task(function* () { this.set('stripeConnectError', null); this.set('stripeConnectSuccess', null); @@ -292,8 +316,7 @@ export default Component.extend({ } ); this.product.set('stripePrices', stripePrices); - yield timeout(3000); - const updatedProduct = yield this.product.save(); + const updatedProduct = yield this.saveProduct.perform(); const monthlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'month', 500, 'usd'); const yearlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'year', 5000, 'usd'); this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id); From 13c2f877d706ab1cc765a78c3668b0f74ece8b89 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 24 May 2021 15:52:41 +0530 Subject: [PATCH 0363/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20retry=20email?= =?UTF-8?q?=20not=20timing=20out=20on=20poll?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no refs Fixes a small bug in email retry logic meant we never timeout on polling for email retry while listening for the email status to see if it failed or submitted. --- app/components/gh-post-settings-menu/email.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/components/gh-post-settings-menu/email.js b/app/components/gh-post-settings-menu/email.js index eae921e842..571d88c656 100644 --- a/app/components/gh-post-settings-menu/email.js +++ b/app/components/gh-post-settings-menu/email.js @@ -125,6 +125,7 @@ export default Component.extend({ if (email.status === 'failed') { throw new EmailFailedError(email.error); } + pollTimeout += RETRY_EMAIL_POLL_LENGTH; } } From 3ecf3db5472f55931373285d4fe9bb8fe71e0af6 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 24 May 2021 14:03:08 +0100 Subject: [PATCH 0364/3032] Fixed portal previews flashing background (#1975) refs https://github.com/TryGhost/Team/issues/701 requires Portal@1.4.2 or later - changed `` to accept a string in place of a `true/false` value - if a string is passed then we'll set up a message event listener than listens for a `postMessage` from the iframe with data that matches the supplied string - updated `` usage for portal previews to use `@invisibleUntilLoaded="portal-ready"` so they listen for a message event rather than displaying as soon as we get a load event --- app/components/gh-site-iframe.hbs | 1 + app/components/gh-site-iframe.js | 23 ++++++++++++++++++++++- app/components/modal-portal-settings.hbs | 2 +- app/templates/settings/membership.hbs | 2 +- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/components/gh-site-iframe.hbs b/app/components/gh-site-iframe.hbs index c845266a41..ecb5915eac 100644 --- a/app/components/gh-site-iframe.hbs +++ b/app/components/gh-site-iframe.hbs @@ -3,6 +3,7 @@ src={{this.srcUrl}} frameborder="0" allowtransparency="true" + {{did-insert this.attachMessageListener}} {{did-update this.resetSrcAttribute @guid}} {{on "load" this.onLoad}} ...attributes diff --git a/app/components/gh-site-iframe.js b/app/components/gh-site-iframe.js index 7f3a7e384a..cf539b3aed 100644 --- a/app/components/gh-site-iframe.js +++ b/app/components/gh-site-iframe.js @@ -11,6 +11,9 @@ export default class GhSiteIframeComponent extends Component { @tracked isInvisible = this.args.invisibleUntilLoaded; willDestroy() { + if (this.messageListener) { + window.removeEventListener('message', this.messageListener); + } this.args.onDestroyed?.(); } @@ -40,12 +43,30 @@ export default class GhSiteIframeComponent extends Component { @action onLoad(event) { - if (this.args.invisibleUntilLoaded) { + if (this.args.invisibleUntilLoaded && typeof this.args.invisibleUntilLoaded === 'boolean') { this.makeVisible.perform(); } this.args.onLoad?.(event); } + @action + attachMessageListener() { + if (typeof this.args.invisibleUntilLoaded === 'string') { + this.messageListener = (event) => { + const srcURL = new URL(this.srcUrl); + const originURL = new URL(event.origin); + + if (originURL.origin === srcURL.origin) { + if (event.data === this.args.invisibleUntilLoaded) { + this.makeVisible.perform(); + } + } + }; + + window.addEventListener('message', this.messageListener, true); + } + } + @task *makeVisible() { // give any scripts a bit of time to render before making visible diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index ee39d38872..b69f6c3a2d 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -248,7 +248,7 @@ class="gh-portal-siteiframe" @src={{this.portalPreviewUrl}} @guid={{this.portalPreviewGuid}} - @invisibleUntilLoaded={{true}} /> + @invisibleUntilLoaded="portal-ready" />
    diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 8952aadf3d..70eb60e895 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -58,7 +58,7 @@ {{/if}} From 2cd6a15331df93b3605811f1c5384cf4c1e27861 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 24 May 2021 20:02:49 +0530 Subject: [PATCH 0365/3032] Fixed price reset when no monthly/yearly prices no refs When we reset the prices on leaving the membership settings screen, its possible we don't have the prices created already and not able to read any monthly/yearly price. --- app/controllers/settings/membership.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 0da6ada778..806b9d479a 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -413,8 +413,8 @@ export default class MembersAccessController extends Controller { const monthlyPrice = this.getPrice(activePrices, 'monthly'); const yearlyPrice = this.getPrice(activePrices, 'yearly'); - this.stripeMonthlyAmount = (monthlyPrice.amount / 100); - this.stripeYearlyAmount = (yearlyPrice.amount / 100); + this.stripeMonthlyAmount = monthlyPrice ? (monthlyPrice.amount / 100) : 5; + this.stripeYearlyAmount = yearlyPrice ? (yearlyPrice.amount / 100) : 50; } reset() { From 90064bac6a4f08e025d9813ced14a7da8354a396 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 24 May 2021 21:17:40 +0530 Subject: [PATCH 0366/3032] Added stripe connect guard for saving product no refs While saving on membership screen, we also try and save the product with any prices that have changed. In case Stripe is not connected, saving Product doesn't make sense as we should not edit prices for the default product without Stripe connection. --- app/controllers/settings/membership.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 806b9d479a..1645d7556e 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -271,7 +271,8 @@ export default class MembersAccessController extends Controller { } async saveProduct() { - if (this.product) { + const isStripeConnected = this.settings.get('stripeConnectAccountId'); + if (this.product && isStripeConnected) { const stripePrices = this.product.stripePrices || []; const monthlyAmount = this.stripeMonthlyAmount * 100; const yearlyAmount = this.stripeYearlyAmount * 100; From c46c5cd0611b4a130f506a3c47e30dadb7042e26 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 24 May 2021 17:27:52 +0100 Subject: [PATCH 0367/3032] Fixed portal preview resize and cached page bugs no issue - moved `@onLoad` trigger from `load` event to the `makeVisible()` task so that consumer code isn't called before load has fully finished - fixes issue with portal sometimes not being ready when we perform the resize on the membership screen - added guid as a cache-busting `?v={guid}` query param - fixes issue where preview iframe can load stale data after a settings change resulting in a blank preview after going from "nobody" to "invite/anybody" because the loaded homepage is stale and doesn't have the portal script injected --- app/components/gh-site-iframe.js | 14 ++++++++++++-- app/controllers/settings/membership.js | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/components/gh-site-iframe.js b/app/components/gh-site-iframe.js index cf539b3aed..b689eb2cd1 100644 --- a/app/components/gh-site-iframe.js +++ b/app/components/gh-site-iframe.js @@ -18,7 +18,13 @@ export default class GhSiteIframeComponent extends Component { } get srcUrl() { - return this.args.src || `${this.config.get('blogUrl')}/`; + const srcUrl = new URL(this.args.src || `${this.config.get('blogUrl')}/`); + + if (this.args.guid) { + srcUrl.searchParams.set('v', this.args.guid); + } + + return srcUrl.href; } @action @@ -43,10 +49,13 @@ export default class GhSiteIframeComponent extends Component { @action onLoad(event) { + this.iframe = event.target; + if (this.args.invisibleUntilLoaded && typeof this.args.invisibleUntilLoaded === 'boolean') { this.makeVisible.perform(); + } else { + this.args.onLoad?.(this.iframe); } - this.args.onLoad?.(event); } @action @@ -73,5 +82,6 @@ export default class GhSiteIframeComponent extends Component { // allows portal to render it's overlay and prevent site background flashes yield timeout(100); this.isInvisible = false; + this.args.onLoad?.(this.iframe); } } diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 1645d7556e..fab534feaf 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -239,8 +239,8 @@ export default class MembersAccessController extends Controller { } @action - portalPreviewLoaded(event) { - this.portalPreviewIframe = event.target; + portalPreviewLoaded(iframe) { + this.portalPreviewIframe = iframe; this.resizePortalPreviewTask.perform(); } From dbb174209cf757798ba30cafad9952930675b691 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 24 May 2021 18:55:18 +0100 Subject: [PATCH 0368/3032] Added animation to portal preview height (#1977) no issue - add CSS transition for height attribute of portal preview container - before adjusting height of container, apply styles to portal preview nested iframe to prevent scrollbars from showing --- app/components/gh-site-iframe.hbs | 1 + app/controllers/settings/membership.js | 3 +++ app/styles/layouts/settings.css | 1 + 3 files changed, 5 insertions(+) diff --git a/app/components/gh-site-iframe.hbs b/app/components/gh-site-iframe.hbs index ecb5915eac..68a9010c8d 100644 --- a/app/components/gh-site-iframe.hbs +++ b/app/components/gh-site-iframe.hbs @@ -3,6 +3,7 @@ src={{this.srcUrl}} frameborder="0" allowtransparency="true" + scrolling="no" {{did-insert this.attachMessageListener}} {{did-update this.resetSrcAttribute @guid}} {{on "load" this.onLoad}} diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index fab534feaf..ab4ab3276d 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -260,6 +260,9 @@ export default class MembersAccessController extends Controller { return; } + portalIframe.contentWindow.document.body.style.overflow = 'hidden'; + portalIframe.contentWindow.document.body.style['scrollbar-width'] = 'none'; + const portalContainer = portalIframe.contentWindow.document.querySelector('.gh-portal-popup-container'); if (!portalContainer) { return; diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 9b0e2b5450..865fb8a07e 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1645,6 +1645,7 @@ p.theme-validation-details { margin-bottom: 32px; border-radius: 5px; pointer-events: none; + transition: height 0.35s ease-in-out; } .gh-setting-members-portal-disabled { From e69d40035624294b830678a45be19aa99c6c7188 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 24 May 2021 18:59:21 +0100 Subject: [PATCH 0369/3032] Removed errant `scrolling="no"` on `` --- app/components/gh-site-iframe.hbs | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/gh-site-iframe.hbs b/app/components/gh-site-iframe.hbs index 68a9010c8d..ecb5915eac 100644 --- a/app/components/gh-site-iframe.hbs +++ b/app/components/gh-site-iframe.hbs @@ -3,7 +3,6 @@ src={{this.srcUrl}} frameborder="0" allowtransparency="true" - scrolling="no" {{did-insert this.attachMessageListener}} {{did-update this.resetSrcAttribute @guid}} {{on "load" this.onLoad}} From 0a554034d56d0767b932a32d480c7305eac2adac Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Mon, 24 May 2021 20:06:17 +0200 Subject: [PATCH 0370/3032] Portal preview iframe refinements --- app/styles/layouts/settings.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/styles/layouts/settings.css b/app/styles/layouts/settings.css index 865fb8a07e..8d72c978fe 100644 --- a/app/styles/layouts/settings.css +++ b/app/styles/layouts/settings.css @@ -1641,11 +1641,11 @@ p.theme-validation-details { 0 100px 80px rgba(0, 0, 0, 0.07) ; width: 420px; - height: 582px; + height: 562px; margin-bottom: 32px; border-radius: 5px; pointer-events: none; - transition: height 0.35s ease-in-out; + transition: height 0.17s ease-out; } .gh-setting-members-portal-disabled { From c1c51521396041910bd2bacbe3c0e78964b99b24 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 24 May 2021 19:14:31 +0100 Subject: [PATCH 0371/3032] Added `scrolling="no"` back in correct position no issue - property is specific to the membership portal preview rather than all site iframes - fixes page-height scrollbar appearing on portal preview height animation --- app/templates/settings/membership.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 70eb60e895..e4d77b2f8a 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -56,6 +56,7 @@
    {{else}} Date: Mon, 24 May 2021 19:29:18 +0100 Subject: [PATCH 0372/3032] Attempted fix of portal background flash going from nobody->anybody/invite no issue - dropped use of `@guid` tracked param in favour of adding query param to URL in `updatePortalPreview()` and making sure we only update it when necessary --- app/controllers/settings/membership.js | 35 +++++++++++++++----------- app/templates/settings/membership.hbs | 1 - 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index ab4ab3276d..9de6173f26 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -36,7 +36,8 @@ export default class MembersAccessController extends Controller { @tracked stripePlanError = ''; @tracked portalPreviewUrl = ''; - @tracked portalPreviewGuid = Date.now().valueOf(); + + portalPreviewGuid = Date.now().valueOf(); queryParams = ['showPortalSettings']; @@ -110,9 +111,7 @@ export default class MembersAccessController extends Controller { // when saved value is 'none' the server won't inject the portal script // to work around that and show the expected portal preview we save and // force a refresh - await this.saveSettingsTask.perform(); - this.updatePortalPreview(); - this.portalPreviewGuid = Date.now().valueOf(); + await this.saveSettingsTask.perform({forceRefresh: true}); } else { this.updatePortalPreview(); } @@ -145,7 +144,7 @@ export default class MembersAccessController extends Controller { } @action - validateStripePlans() { + validateStripePlans({updatePortalPreview = true} = {}) { this.stripePlanError = undefined; try { @@ -156,7 +155,9 @@ export default class MembersAccessController extends Controller { throw new TypeError(`Subscription amount must be at least ${symbol}1.00`); } - this.updatePortalPreview(); + if (updatePortalPreview) { + this.updatePortalPreview(); + } } catch (err) { this.stripePlanError = err.message; } @@ -171,8 +172,7 @@ export default class MembersAccessController extends Controller { @action async closeStripeConnect() { if (this.stripeEnabledOnOpen !== this.membersUtils.isStripeEnabled) { - await this.saveSettingsTask.perform(); - this.portalPreviewGuid = Date.now().valueOf(); + await this.saveSettingsTask.perform({forceRefresh: true}); } this.showStripeConnect = false; } @@ -208,7 +208,7 @@ export default class MembersAccessController extends Controller { } @action - updatePortalPreview() { + updatePortalPreview({forceRefresh} = {}) { // TODO: can these be worked out from settings in membersUtils? const monthlyPrice = this.stripeMonthlyAmount * 100; const yearlyPrice = this.stripeYearlyAmount * 100; @@ -225,7 +225,7 @@ export default class MembersAccessController extends Controller { isYearlyChecked = true; } - this.portalPreviewUrl = this.membersUtils.getPortalPreviewUrl({ + const newUrl = new URL(this.membersUtils.getPortalPreviewUrl({ button: false, monthlyPrice, yearlyPrice, @@ -233,7 +233,14 @@ export default class MembersAccessController extends Controller { isMonthlyChecked, isYearlyChecked, portalPlans: null - }); + })); + + if (forceRefresh) { + this.portalPreviewGuid = Date.now().valueOf(); + } + newUrl.searchParams.set('v', this.portalPreviewGuid); + + this.portalPreviewUrl = newUrl; this.resizePortalPreviewTask.perform(); } @@ -393,8 +400,8 @@ export default class MembersAccessController extends Controller { } @task({drop: true}) - *saveSettingsTask() { - yield this.validateStripePlans(); + *saveSettingsTask(options) { + yield this.validateStripePlans({updatePortalPreview: false}); if (this.stripePlanError) { return; @@ -407,7 +414,7 @@ export default class MembersAccessController extends Controller { yield this.saveProduct(); const result = yield this.settings.save(); - this.updatePortalPreview(); + this.updatePortalPreview(options); return result; } diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index e4d77b2f8a..2f3e81efd0 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -58,7 +58,6 @@ From 3c67c05803e7380faf90cca9186b15b5400db3b1 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 25 May 2021 09:40:17 +0100 Subject: [PATCH 0373/3032] Fixed preview background flash when switching from none -> all/invite no issue - flash was occurring because as soon as the setting was changed we switched to showing the portal preview but at that time the preview URL is still set to an old url value. The url doesn't get changed until the settings save completes which gives enough time for a non-portal page to load before being replaced - added a `switchFromNoneTask` that is triggered when switching away from a saved none value and updated the template to stay on the "disabled" view until the save has completed so we don't trigger multiple page loads --- app/controllers/settings/membership.js | 7 ++++++- app/templates/settings/membership.hbs | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 9de6173f26..d04dbf0d06 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -111,7 +111,7 @@ export default class MembersAccessController extends Controller { // when saved value is 'none' the server won't inject the portal script // to work around that and show the expected portal preview we save and // force a refresh - await this.saveSettingsTask.perform({forceRefresh: true}); + await this.switchFromNoneTask.perform(); } else { this.updatePortalPreview(); } @@ -257,6 +257,11 @@ export default class MembersAccessController extends Controller { this.resizePortalPreviewTask.cancelAll(); } + @task + *switchFromNoneTask() { + return yield this.saveSettingsTask.perform({forceRefresh: true}); + } + @task({restartable: true}) *resizePortalPreviewTask() { if (this.portalPreviewIframe && this.portalPreviewIframe.contentWindow) { diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index 2f3e81efd0..cb4d06c4e1 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -48,7 +48,7 @@
    - {{#if (eq this.settings.membersSignupAccess 'none')}} + {{#if (or (eq this.settings.membersSignupAccess 'none') this.switchFromNoneTask.isRunning)}}
    {{svg-jar "portal-logo-stroke"}}

    Portal disabled

    From 9ee88b742fb5f256f111f7ce2052147dea27316c Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 25 May 2021 10:09:13 +0100 Subject: [PATCH 0374/3032] Disabled "Customise portal" button when signup access is disabled no issue - when signup access is set to "none" the portal preview will be blank and the settings not available so it doesn't make sense to make the customise portal modal available --- app/templates/settings/membership.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index cb4d06c4e1..b8fdbcbe6f 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -33,7 +33,7 @@ Customize members modal signup flow

    -
    From 728a2771aeb651ca96dac47139b691778d06c9fa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 11:07:17 +0100 Subject: [PATCH 0375/3032] Update dependency grunt to v1.4.1 (#1976) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3bf68b2883..febf7274a7 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "fs-extra": "10.0.0", "glob": "7.1.7", "google-caja-bower": "https://github.com/acburdine/google-caja-bower#ghost", - "grunt": "1.4.0", + "grunt": "1.4.1", "grunt-shell": "3.0.1", "keymaster": "https://github.com/madrobby/keymaster.git", "liquid-fire": "0.31.0", diff --git a/yarn.lock b/yarn.lock index b26bcfa8f8..99eb43e690 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8540,6 +8540,11 @@ grunt-known-options@~1.1.1: resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d" integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ== +grunt-known-options@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-2.0.0.tgz#cac641e897f9a0a680b8c9839803d35f3325103c" + integrity sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA== + grunt-legacy-log-utils@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz#49a8c7dc74051476dcc116c32faf9db8646856ef" @@ -8580,10 +8585,10 @@ grunt-shell@3.0.1: npm-run-path "^2.0.0" strip-ansi "^5.0.0" -grunt@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.4.0.tgz#235219cf922cf5f249809d60722442bb8247eff7" - integrity sha512-yRFc0GVCDu9yxqOFzpuXQ2pEdgtLDnFv5Qz54jfIcNnpJ8Z7B7P7kPkT4VMuRvm+N+QOsI8C4v/Q0DSaoj3LgQ== +grunt@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.4.1.tgz#7d1e17db1f9c8108777f7273d6b9359755576f50" + integrity sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA== dependencies: dateformat "~3.0.3" eventemitter2 "~0.4.13" @@ -8591,7 +8596,7 @@ grunt@1.4.0: findup-sync "~0.3.0" glob "~7.1.6" grunt-cli "~1.4.2" - grunt-known-options "~1.1.1" + grunt-known-options "~2.0.0" grunt-legacy-log "~3.0.0" grunt-legacy-util "~2.0.1" iconv-lite "~0.4.13" From 614b8c1ea35d48bdbea5d06e6e61473a3cf0f5bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 11:08:14 +0100 Subject: [PATCH 0376/3032] Update dependency ember-test-selectors to v5.3.0 (#1978) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index febf7274a7..ac3a401ca1 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "ember-sinon": "5.0.0", "ember-source": "3.21.3", "ember-svg-jar": "2.3.3", - "ember-test-selectors": "5.2.0", + "ember-test-selectors": "5.3.0", "ember-tooltips": "3.4.7", "ember-truth-helpers": "3.0.0", "ember-useragent": "0.10.0", diff --git a/yarn.lock b/yarn.lock index 99eb43e690..89d6060613 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6849,10 +6849,10 @@ ember-svg-jar@2.3.3: mkdirp "^0.5.1" path-posix "^1.0.0" -ember-test-selectors@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-5.2.0.tgz#1eab8698b9ab47c9e2fcf73f8c63623d1ed75007" - integrity sha512-k/qqdpnEZO8smmMXrxHlc1fgkilSq0rYLqopwqG9Q24/tHYb8DWQkYshJzjlSNKm328gaMFZ39YtyUIASXoRdg== +ember-test-selectors@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-5.3.0.tgz#1dee515e43e7beb7b7083a2fee2cdf808bf9de26" + integrity sha512-B9kkCTO39l+XXcp6eRnfZWHeeL3Ffxdux8chXHSwmAPYCc50KI8VW7mr1uy2ZcUMNP/o0sk7VrpA6x3lBkSvWQ== dependencies: calculate-cache-key-for-tree "^2.0.0" ember-cli-babel "^7.26.4" From e060826724cea3b73fb9dc6d10f8eeb7ad78cb73 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Tue, 25 May 2021 14:00:14 +0200 Subject: [PATCH 0377/3032] Refined icon color --- app/components/settings/members-subscription-access.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/settings/members-subscription-access.js b/app/components/settings/members-subscription-access.js index fad6a33f34..c98c8da627 100644 --- a/app/components/settings/members-subscription-access.js +++ b/app/components/settings/members-subscription-access.js @@ -23,7 +23,7 @@ export default class SettingsMembersSubscriptionAccess extends Component { description: 'No one will be able to subscribe or sign in', value: 'none', icon: 'no-members', - icon_color: 'pink' + icon_color: 'midlightgrey-d2' }]; } From d984005b166a3f54a1d1fe963aa70041d676c45a Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Tue, 25 May 2021 15:11:56 +0100 Subject: [PATCH 0378/3032] v4.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac3a401ca1..4f6c7d2c0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.5.0", + "version": "4.6.0", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From a72709cf89a5e39175ff8d81d879d3b94f299dd2 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Thu, 6 May 2021 21:45:27 +0530 Subject: [PATCH 0379/3032] Fixed member details not loading refs https://github.com/TryGhost/Team/issues/660 We added a guard to not send price object in a subscription when the data is missing from DB. This can cause the member details page to fail with the missing price object, so this change adds a guard against subscriptions with missing price. Note: This is only a short-term fix till we add a proper fix to cleanup the DB in the subsequent release. --- app/components/gh-member-settings-form-cp.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/components/gh-member-settings-form-cp.js b/app/components/gh-member-settings-form-cp.js index ed4f95a94d..182493f23d 100644 --- a/app/components/gh-member-settings-form-cp.js +++ b/app/components/gh-member-settings-form-cp.js @@ -40,7 +40,9 @@ export default class extends Component { get products() { let products = this.member.get('products') || []; let subscriptions = this.member.get('subscriptions') || []; - let subscriptionData = subscriptions.map((sub) => { + let subscriptionData = subscriptions.filter((sub) => { + return !!sub.price; + }).map((sub) => { return { ...sub, startDate: sub.start_date ? moment(sub.start_date).format('D MMM YYYY') : '-', From 4a4757a0b0d9c953eff51cf9558e9d7030ea6213 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 26 May 2021 17:01:18 +0100 Subject: [PATCH 0380/3032] Added Sentry error tracking for unhandled exceptions and API errors refs https://github.com/TryGhost/Team/issues/723 - if the `/site/` API returns a `sentry_dsn` then we configure Sentry for error reporting as soon as we've loaded the initial unauthenticated data - once we're authenticated and we have the full Ghost version available, override the Sentry event processor to use the full release - updated `notifications.showAlert()` which is our fallback for API errors that shows the red banner at the top - these are the errors we're most interested in getting visibility for and reducing --- app/routes/application.js | 29 +++++++- app/services/notifications.js | 6 ++ config/environment.js | 5 ++ package.json | 1 + yarn.lock | 134 +++++++++++++++++++++++++++++++++- 5 files changed, 173 insertions(+), 2 deletions(-) diff --git a/app/routes/application.js b/app/routes/application.js index 1eae06163b..2e724b8909 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -4,6 +4,8 @@ import Route from '@ember/routing/route'; import ShortcutsRoute from 'ghost-admin/mixins/shortcuts-route'; import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd'; import windowProxy from 'ghost-admin/utils/window-proxy'; +import {InitSentryForEmber} from '@sentry/ember'; +import {configureScope} from '@sentry/browser'; import { isAjaxError, isNotFoundError, @@ -49,7 +51,18 @@ export default Route.extend(ShortcutsRoute, { }, beforeModel() { - return this.config.fetchUnauthenticated(); + return this.config.fetchUnauthenticated() + .then(() => { + // init Sentry here rather than app.js so that we can use API-supplied + // sentry_dsn and sentry_env rather than building it into release assets + if (this.config.get('sentry_dsn')) { + InitSentryForEmber({ + dsn: this.config.get('sentry_dsn'), + environment: this.config.get('sentry_env'), + release: `ghost@${this.config.get('version')}` + }); + } + }); }, afterModel(model, transition) { @@ -68,6 +81,20 @@ export default Route.extend(ShortcutsRoute, { ]).then((results) => { this._appLoaded = true; + // update Sentry with the full Ghost version which we only get after authentication + if (this.config.get('sentry_dsn')) { + configureScope((scope) => { + scope.addEventProcessor((event) => { + return new Promise((resolve) => { + resolve({ + ...event, + release: `ghost@${this.config.get('version')}` + }); + }); + }); + }); + } + // kick off background update of "whats new" // - we don't want to block the router for this // - we need the user details to know what the user has seen diff --git a/app/services/notifications.js b/app/services/notifications.js index 2ed0290023..e913318226 100644 --- a/app/services/notifications.js +++ b/app/services/notifications.js @@ -1,4 +1,5 @@ import Service, {inject as service} from '@ember/service'; +import {captureMessage} from '@sentry/browser'; import {dasherize} from '@ember/string'; import {A as emberA, isArray as isEmberArray} from '@ember/array'; import {filter} from '@ember/object/computed'; @@ -29,6 +30,7 @@ export default Service.extend({ this.content = emberA(); }, + config: service(), upgradeStatus: service(), alerts: filter('content', function (notification) { @@ -99,6 +101,10 @@ export default Service.extend({ }, showAPIError(resp, options) { + if (this.config.get('sentry_dsn')) { + captureMessage(resp); + } + // handle "global" errors if (isVersionMismatchError(resp)) { return this.upgradeStatus.requireUpgrade(); diff --git a/config/environment.js b/config/environment.js index 43e312f96a..1ed08e4c46 100644 --- a/config/environment.js +++ b/config/environment.js @@ -39,6 +39,11 @@ module.exports = function (environment) { emberKeyboard: { disableInputsInitializer: true + }, + + '@sentry/ember': { + disablePerformance: true, + sentry: {} } }; diff --git a/package.json b/package.json index 4f6c7d2c0c..9d8a2260bf 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "2.0.0", + "@sentry/ember": "6.4.1", "@tryghost/helpers": "1.1.45", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", diff --git a/yarn.lock b/yarn.lock index 89d6060613..6725df7bc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1338,6 +1338,45 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" +"@embroider/core@0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.37.0.tgz#bd7a7d63795794ffcd53d90a65b81e939ccf6cff" + integrity sha512-tkXD7qV9GJYb7cGlxLT4PTbPZ+B4vNDXp5oHyEz8EQSuZExN/40Hm90S5KrEC++TpqeVewSIXOz/fA53lkK6RQ== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.37.0" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-node-api "^1.7.0" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.1" + broccoli-source "^3.0.0" + debug "^3.1.0" + escape-string-regexp "^4.0.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.4.2" + js-string-escape "^1.0.1" + jsdom "^16.4.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^7.3.2" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" + "@embroider/macros@0.24.1", "@embroider/macros@^0.24.1": version "0.24.1" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.24.1.tgz#0ab11b88d148f35c91f438f0b44f96fbf1607a9b" @@ -1398,6 +1437,21 @@ resolve "^1.8.1" semver "^7.3.2" +"@embroider/macros@0.37.0", "@embroider/macros@~0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.37.0.tgz#221013fc5bc0eaa78f1de98802fc03e588bfe1b1" + integrity sha512-VItxn4NzGR5prryXGbPGTuLMd+QPPKvAYZv2357iS+wmz6mTzC5nqXljwDQIOJbAji9giDO+FW2HzXYOcY3teQ== + dependencies: + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.37.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" + semver "^7.3.2" + "@embroider/macros@^0.40.0": version "0.40.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.40.0.tgz#f58763b4cfb9b4089679b478a28627595341bc5a" @@ -1613,6 +1667,84 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" +"@sentry/browser@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.4.1.tgz#b6c62736caaade7fdf6638513d9aad138abde2ac" + integrity sha512-3cDud6GWutnJqcnheIq0lPNTsUJbrRLevQ+g1YfawVXFUxfmmY2bOsGd/Mxq17LxYeBHgKTitXv3DU1bsQ+WBQ== + dependencies: + "@sentry/core" "6.4.1" + "@sentry/types" "6.4.1" + "@sentry/utils" "6.4.1" + tslib "^1.9.3" + +"@sentry/core@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.4.1.tgz#789b0071996de5c1a20673f879408926aa3b4fa6" + integrity sha512-Lx13oTiP+Tjvm5VxulcCszNVd2S1wY4viSnr+ygq62ySVERR+t7uOZDSARZ0rZ259GwW6nkbMh9dDmD0d6VCGQ== + dependencies: + "@sentry/hub" "6.4.1" + "@sentry/minimal" "6.4.1" + "@sentry/types" "6.4.1" + "@sentry/utils" "6.4.1" + tslib "^1.9.3" + +"@sentry/ember@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@sentry/ember/-/ember-6.4.1.tgz#632c739942dd29311b83f0b6d4344dee4c2eddb4" + integrity sha512-e3N5EK+mtZGqIk4wkt1E3Wh5beKuGlydSuNrTSaAJcJ45I8kyZ93mX47yjs4uyrY7eSiDYLQqUBu683YhInwZQ== + dependencies: + "@embroider/macros" "~0.37.0" + "@sentry/browser" "6.4.1" + "@sentry/tracing" "6.4.1" + "@sentry/types" "6.4.1" + "@sentry/utils" "6.4.1" + ember-auto-import "^1.6.0" + ember-cli-babel "^7.20.5" + ember-cli-htmlbars "^5.1.2" + ember-cli-typescript "^3.1.4" + +"@sentry/hub@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.4.1.tgz#fa9c05ca32674e2e8477120b71084a1c91a5e023" + integrity sha512-7IZRP5buDE6s/c3vWzzPR/ySE+8GUuHPgTEPiDCPOCWwUN11zXDafJDKkJqY3muJfebUKmC/JG67RyBx+XlnlQ== + dependencies: + "@sentry/types" "6.4.1" + "@sentry/utils" "6.4.1" + tslib "^1.9.3" + +"@sentry/minimal@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.4.1.tgz#d3f968c060c3d3cc997071756659e24047b5dd97" + integrity sha512-4x/PRbDZACCKJqjta9EkhiIMyGMf7VgBX13EEWEDVWLP7ymFukBuTr4ap/Tz9429kB/yXZuDGGMIZp/G618H3g== + dependencies: + "@sentry/hub" "6.4.1" + "@sentry/types" "6.4.1" + tslib "^1.9.3" + +"@sentry/tracing@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.4.1.tgz#3a9119e1ef5206ea565854c325b19a317cc1cca7" + integrity sha512-EPRadE9n/wpUjx4jqP/8vXdOAZBk7vjlzRKniJgKgQUO3v03i0ui6xydaal2mvhplIyOCI2muXdGhjUO7ga4uw== + dependencies: + "@sentry/hub" "6.4.1" + "@sentry/minimal" "6.4.1" + "@sentry/types" "6.4.1" + "@sentry/utils" "6.4.1" + tslib "^1.9.3" + +"@sentry/types@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.4.1.tgz#7c0a4355a1d04321b901197723a8f55c263226e9" + integrity sha512-sTu/GaLsLYk1AkAqpkMT4+4q665LtZjhV0hkgiTD4N3zPl5uSf1pCIzxPRYjOpe7NEANmWv8U4PaGKGtc2eMfA== + +"@sentry/utils@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.4.1.tgz#55fa7da58898773cbd538e4895fc2e4ec695ecab" + integrity sha512-xJ1uVa5fvg23pXQfulvCIBb9pQ3p1awyd1PapK2AYi+wKjTuYl4B9edmhjRREEQEExznl/d2OVm78fRXLq7M9Q== + dependencies: + "@sentry/types" "6.4.1" + tslib "^1.9.3" + "@simple-dom/interface@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" @@ -14166,7 +14298,7 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -tslib@^1.9.0: +tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== From 3f09772d2fa6d77fbc447143549a814784ef6b2b Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 26 May 2021 17:18:02 +0100 Subject: [PATCH 0381/3032] Switched from `Sentry.captureMessage` to `captureException` for better logging no issue - `Sentry.captureMessage` is used for plain text messages rather than errors or objects --- app/services/notifications.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/notifications.js b/app/services/notifications.js index e913318226..40c6bc3b70 100644 --- a/app/services/notifications.js +++ b/app/services/notifications.js @@ -1,5 +1,5 @@ import Service, {inject as service} from '@ember/service'; -import {captureMessage} from '@sentry/browser'; +import {captureException} from '@sentry/browser'; import {dasherize} from '@ember/string'; import {A as emberA, isArray as isEmberArray} from '@ember/array'; import {filter} from '@ember/object/computed'; @@ -102,7 +102,7 @@ export default Service.extend({ showAPIError(resp, options) { if (this.config.get('sentry_dsn')) { - captureMessage(resp); + captureException(resp); } // handle "global" errors From 55238900eadef68b47ebcd1160b9d50f3f5263a6 Mon Sep 17 00:00:00 2001 From: ceecko Date: Fri, 30 Apr 2021 22:26:36 +0200 Subject: [PATCH 0382/3032] =?UTF-8?q?=F0=9F=8E=A8=20Added=20error=20messag?= =?UTF-8?q?e=20from=20limit=20service=20to=20theme=20upload?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no issue - Addresses https://github.com/TryGhost/Admin/commit/16debb75a994f16ff5079f2f2896ed9958e4cbbe#r49241896 - Uses limit service to display the configured error message --- .../modal-upgrade-host-limit-custom-theme.hbs | 6 ++- app/controllers/settings/theme.js | 12 ++++++ app/routes/settings/theme/uploadtheme.js | 38 +++++++++++++++---- app/templates/settings/theme.hbs | 3 ++ app/templates/settings/theme/uploadtheme.hbs | 23 +++++++---- 5 files changed, 67 insertions(+), 15 deletions(-) diff --git a/app/components/modal-upgrade-host-limit-custom-theme.hbs b/app/components/modal-upgrade-host-limit-custom-theme.hbs index e8d3e26f22..3f4344d10b 100644 --- a/app/components/modal-upgrade-host-limit-custom-theme.hbs +++ b/app/components/modal-upgrade-host-limit-custom-theme.hbs @@ -6,7 +6,11 @@ diff --git a/app/controllers/settings/theme.js b/app/controllers/settings/theme.js index f387cf38b2..6e0463889a 100644 --- a/app/controllers/settings/theme.js +++ b/app/controllers/settings/theme.js @@ -55,6 +55,7 @@ export default Controller.extend({ themes: null, themeToDelete: null, displayUpgradeModal: false, + limitErrorMessage: null, init() { this._super(...arguments); @@ -73,6 +74,17 @@ export default Controller.extend({ async activateTheme(theme) { const isOverLimit = await this.limit.checkWouldGoOverLimit('customThemes', {value: theme.name}); if (isOverLimit) { + try { + await this.limit.limiter.errorIfWouldGoOverLimit('customThemes', {value: theme.name}); + this.limitErrorMessage = null; + } catch (error) { + if (error.errorType !== 'HostLimitError') { + throw error; + } + + this.limitErrorMessage = error.message; + } + this.set('displayUpgradeModal', true); return; } diff --git a/app/routes/settings/theme/uploadtheme.js b/app/routes/settings/theme/uploadtheme.js index 027b4e5126..cf9de857ab 100644 --- a/app/routes/settings/theme/uploadtheme.js +++ b/app/routes/settings/theme/uploadtheme.js @@ -1,18 +1,42 @@ import AuthenticatedRoute from 'ghost-admin/routes/authenticated'; +import {inject as service} from '@ember/service'; -export default AuthenticatedRoute.extend({ +export default class UploadthemeRouter extends AuthenticatedRoute { + @service limit; - model() { - return this.store.findAll('theme'); - }, + limitErrorMessage = null + + async model() { + // TODO: The "Upload a theme" button may welcome a spinner in case the limiter introduces + // an actual async operation. Without a spinner the UI may seem unresponsive after a click. + const [themes] = await Promise.all([ + this.store.findAll('theme'), + // Sending a bad string to make sure it fails (empty string isn't valid) + this.limit.limiter.errorIfWouldGoOverLimit('customThemes', {value: '.'}) + .then(() => { + this.limitErrorMessage = null; + }) + .catch((error) => { + if (error.errorType === 'HostLimitError') { + this.limitErrorMessage = error.message; + return; + } + + throw error; + }) + ]); + + return themes; + } setupController(controller, model) { controller.set('themes', model); - }, + controller.set('limitErrorMessage', this.limitErrorMessage); + } - actions: { + actions = { cancel() { this.transitionTo('settings.theme'); } } -}); +} diff --git a/app/templates/settings/theme.hbs b/app/templates/settings/theme.hbs index 8aa7332bc8..474cea4c3d 100644 --- a/app/templates/settings/theme.hbs +++ b/app/templates/settings/theme.hbs @@ -104,6 +104,9 @@ {{#if this.displayUpgradeModal}} {{/if}} diff --git a/app/templates/settings/theme/uploadtheme.hbs b/app/templates/settings/theme/uploadtheme.hbs index 0631820a30..d9ede6f1ab 100644 --- a/app/templates/settings/theme/uploadtheme.hbs +++ b/app/templates/settings/theme/uploadtheme.hbs @@ -1,7 +1,16 @@ - +{{#if this.isAllowed}} + +{{else}} + +{{/if}} \ No newline at end of file From a3613fccce8ae0a84ddbbd91898feb2cab6fab30 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Wed, 26 May 2021 18:46:08 +0100 Subject: [PATCH 0383/3032] v4.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9d8a2260bf..74efa2bf20 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.6.0", + "version": "4.6.1", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 6e3e93fe1de6d878553a16f2ecd07838704e8546 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 26 May 2021 20:29:41 +0100 Subject: [PATCH 0384/3032] Sorted snippets alphabetically in card menus no issue - more logical ordering --- app/controllers/editor.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/editor.js b/app/controllers/editor.js index c2293cd69d..4b213bd164 100644 --- a/app/controllers/editor.js +++ b/app/controllers/editor.js @@ -144,8 +144,10 @@ export default Controller.extend({ return this.store.peekAll('snippet'); }), - snippets: computed('_snippets.@each.isNew', function () { - return this._snippets.reject(snippet => snippet.get('isNew')); + snippets: computed('_snippets.@each.{name,isNew}', function () { + return this._snippets + .reject(snippet => snippet.get('isNew')) + .sort((a, b) => a.name.localeCompare(b.name)); }), canManageSnippets: computed('session.user.{isOwnerOrAdmin,isEditor}', function () { From 13b3a97fb663f50db30aca47938cbafd474e300d Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Thu, 27 May 2021 08:17:23 +0100 Subject: [PATCH 0385/3032] v4.6.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74efa2bf20..b0f904a11c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.6.1", + "version": "4.6.2", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 4b8555ca4d09f1b87fb60523ccf3a376c20d5a17 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 27 May 2021 11:00:10 +0100 Subject: [PATCH 0386/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20error=20on=20m?= =?UTF-8?q?embership=20screen=20when=20using=20split=20front-end/admin=20U?= =?UTF-8?q?RLs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no issue - when the preview iframe origin does not match the admin origin (ie, front-end and admin live on different URLs) we would hit browser security restrictions for accessing contents of a cross-origin iframe - added a guard around the preview resize code so we abort resizing when we hit a security error --- app/controllers/settings/membership.js | 36 ++++++++++++++++---------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index d04dbf0d06..9f82849d1b 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -267,21 +267,29 @@ export default class MembersAccessController extends Controller { if (this.portalPreviewIframe && this.portalPreviewIframe.contentWindow) { yield timeout(100); // give time for portal to re-render - const portalIframe = this.portalPreviewIframe.contentWindow.document.querySelector('#ghost-portal-root iframe'); - if (!portalIframe) { - return; + try { + const portalIframe = this.portalPreviewIframe.contentWindow.document.querySelector('#ghost-portal-root iframe'); + if (!portalIframe) { + return; + } + + portalIframe.contentWindow.document.body.style.overflow = 'hidden'; + portalIframe.contentWindow.document.body.style['scrollbar-width'] = 'none'; + + const portalContainer = portalIframe.contentWindow.document.querySelector('.gh-portal-popup-container'); + if (!portalContainer) { + return; + } + + const height = portalContainer.clientHeight; + this.portalPreviewIframe.parentNode.style.height = `${height}px`; + } catch (e) { + if (e.name === 'SecurityError') { + // cross-origin blocked + return; + } + throw e; } - - portalIframe.contentWindow.document.body.style.overflow = 'hidden'; - portalIframe.contentWindow.document.body.style['scrollbar-width'] = 'none'; - - const portalContainer = portalIframe.contentWindow.document.querySelector('.gh-portal-popup-container'); - if (!portalContainer) { - return; - } - - const height = portalContainer.clientHeight; - this.portalPreviewIframe.parentNode.style.height = `${height}px`; } } From 0805366e6b694d65216863b11495e44cc82fdaca Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 27 May 2021 13:20:37 +0100 Subject: [PATCH 0387/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20portal=20previ?= =?UTF-8?q?ew=20resize=20when=20using=20split=20front-end/admin=20URLs=20(?= =?UTF-8?q?#1980)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no issue - switched to listening to Portal's `message` events that now include a height - removes need to reach into Portal preview iframe contents which is blocked by browser security when working cross-origin --- app/components/gh-site-iframe.hbs | 1 + app/components/gh-site-iframe.js | 6 ++- app/controllers/settings/membership.js | 58 ++++++++++---------------- app/templates/settings/membership.hbs | 2 +- 4 files changed, 28 insertions(+), 39 deletions(-) diff --git a/app/components/gh-site-iframe.hbs b/app/components/gh-site-iframe.hbs index ecb5915eac..29cbbd55cd 100644 --- a/app/components/gh-site-iframe.hbs +++ b/app/components/gh-site-iframe.hbs @@ -3,6 +3,7 @@ src={{this.srcUrl}} frameborder="0" allowtransparency="true" + {{did-insert (optional @onInserted)}} {{did-insert this.attachMessageListener}} {{did-update this.resetSrcAttribute @guid}} {{on "load" this.onLoad}} diff --git a/app/components/gh-site-iframe.js b/app/components/gh-site-iframe.js index b689eb2cd1..32f9e7c65f 100644 --- a/app/components/gh-site-iframe.js +++ b/app/components/gh-site-iframe.js @@ -62,11 +62,15 @@ export default class GhSiteIframeComponent extends Component { attachMessageListener() { if (typeof this.args.invisibleUntilLoaded === 'string') { this.messageListener = (event) => { + if (this.isDestroying || this.isDestroyed) { + return; + } + const srcURL = new URL(this.srcUrl); const originURL = new URL(event.origin); if (originURL.origin === srcURL.origin) { - if (event.data === this.args.invisibleUntilLoaded) { + if (event.data === this.args.invisibleUntilLoaded || event.data.type === this.args.invisibleUntilLoaded) { this.makeVisible.perform(); } } diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index 9f82849d1b..ad9d2536ee 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -4,7 +4,6 @@ import {action} from '@ember/object'; import {currencies, getCurrencyOptions, getSymbol} from 'ghost-admin/utils/currency'; import {inject as service} from '@ember/service'; import {task} from 'ember-concurrency-decorators'; -import {timeout} from 'ember-concurrency'; import {tracked} from '@glimmer/tracking'; const CURRENCIES = currencies.map((currency) => { @@ -241,20 +240,36 @@ export default class MembersAccessController extends Controller { newUrl.searchParams.set('v', this.portalPreviewGuid); this.portalPreviewUrl = newUrl; - - this.resizePortalPreviewTask.perform(); } @action - portalPreviewLoaded(iframe) { + portalPreviewInserted(iframe) { this.portalPreviewIframe = iframe; - this.resizePortalPreviewTask.perform(); + + if (!this.portalMessageListener) { + this.portalMessageListener = (event) => { + // don't resize membership portal preview when events fire in customize portal modal + if (this.showPortalSettings) { + return; + } + + const resizeEvents = ['portal-ready', 'portal-preview-updated']; + if (resizeEvents.includes(event.data.type) && event.data.payload?.height) { + this.portalPreviewIframe.parentNode.style.height = `${event.data.payload.height}px`; + } + }; + + window.addEventListener('message', this.portalMessageListener, true); + } } @action portalPreviewDestroyed() { this.portalPreviewIframe = null; - this.resizePortalPreviewTask.cancelAll(); + + if (this.portalMessageListener) { + window.removeEventListener('message', this.portalMessageListener); + } } @task @@ -262,37 +277,6 @@ export default class MembersAccessController extends Controller { return yield this.saveSettingsTask.perform({forceRefresh: true}); } - @task({restartable: true}) - *resizePortalPreviewTask() { - if (this.portalPreviewIframe && this.portalPreviewIframe.contentWindow) { - yield timeout(100); // give time for portal to re-render - - try { - const portalIframe = this.portalPreviewIframe.contentWindow.document.querySelector('#ghost-portal-root iframe'); - if (!portalIframe) { - return; - } - - portalIframe.contentWindow.document.body.style.overflow = 'hidden'; - portalIframe.contentWindow.document.body.style['scrollbar-width'] = 'none'; - - const portalContainer = portalIframe.contentWindow.document.querySelector('.gh-portal-popup-container'); - if (!portalContainer) { - return; - } - - const height = portalContainer.clientHeight; - this.portalPreviewIframe.parentNode.style.height = `${height}px`; - } catch (e) { - if (e.name === 'SecurityError') { - // cross-origin blocked - return; - } - throw e; - } - } - } - async saveProduct() { const isStripeConnected = this.settings.get('stripeConnectAccountId'); if (this.product && isStripeConnected) { diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index b8fdbcbe6f..ed052ff1e8 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -59,7 +59,7 @@ scrolling="no" @src={{this.portalPreviewUrl}} @invisibleUntilLoaded="portal-ready" - @onLoad={{this.portalPreviewLoaded}} + @onInserted={{this.portalPreviewInserted}} @onDestroyed={{this.portalPreviewDestroyed}} /> {{/if}}
    From 8909ee2b829387569bd45831965ae500fdf6b874 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Thu, 27 May 2021 17:25:35 +0100 Subject: [PATCH 0388/3032] v4.6.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b0f904a11c..790c67bdd5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.6.2", + "version": "4.6.3", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 877b58b60b6e372b05f97a5ed175a367d925db6b Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 27 May 2021 17:59:22 +0100 Subject: [PATCH 0389/3032] Converted to glimmer component no issue - switched to Ember Octane patterns - use native class instead of EmberObject syntax - moved container element into template --- app/components/gh-koenig-editor.hbs | 73 ++++----- app/components/gh-koenig-editor.js | 221 +++++++++++++--------------- 2 files changed, 139 insertions(+), 155 deletions(-) diff --git a/app/components/gh-koenig-editor.hbs b/app/components/gh-koenig-editor.hbs index 076d71b058..a0bcd3b89f 100644 --- a/app/components/gh-koenig-editor.hbs +++ b/app/components/gh-koenig-editor.hbs @@ -1,37 +1,40 @@ -{{!-- full height content pane --}} -
    - +
    + {{!-- full height content pane --}} +
    + - + +
    \ No newline at end of file diff --git a/app/components/gh-koenig-editor.js b/app/components/gh-koenig-editor.js index 569267cc44..7e1f4e993c 100644 --- a/app/components/gh-koenig-editor.js +++ b/app/components/gh-koenig-editor.js @@ -1,148 +1,129 @@ -import Component from '@ember/component'; - -export default Component.extend({ - - // public attrs - classNames: ['gh-koenig-editor', 'relative', 'w-100', 'vh-100', 'overflow-x-hidden', 'overflow-y-auto', 'z-0'], - title: '', - titlePlaceholder: '', - body: null, - bodyPlaceholder: '', - bodyAutofocus: false, - - // internal properties - _title: null, - _editor: null, - _mousedownY: 0, - - // closure actions - onTitleChange() {}, - onTitleBlur() {}, - onBodyChange() {}, - onEditorCreated() {}, - onWordCountChange() {}, - - actions: { - focusTitle() { - this._title.focus(); - }, +import Component from '@glimmer/component'; +import {action} from '@ember/object'; + +export default class GhKoenigEditorComponent extends Component { + containerElement = null; + titleElement = null; + koenigEditor = null; + mousedownY = 0; + + @action + registerElement(element) { + this.containerElement = element; + } + @action + trackMousedown(event) { // triggered when a mousedown is registered on .gh-koenig-editor-pane - trackMousedown(event) { - this._mousedownY = event.clientY; - }, - - // triggered when a mouseup is registered on .gh-koenig-editor-pane - focusEditor(event) { - if (event.target.classList.contains('gh-koenig-editor-pane')) { - let editorCanvas = this._editor.element; - let {bottom} = editorCanvas.getBoundingClientRect(); - - // if a mousedown and subsequent mouseup occurs below the editor - // canvas, focus the editor and put the cursor at the end of the - // document - if (this._mousedownY > bottom && event.clientY > bottom) { - let {post} = this._editor; - let range = post.toRange(); - let {tailSection} = range; - - event.preventDefault(); - this._editor.focus(); - - // we should always have a visible cursor when focusing - // at the bottom so create an empty paragraph if last - // section is a card - if (tailSection.isCardSection) { - this._editor.run((postEditor) => { - let newSection = postEditor.builder.createMarkupSection('p'); - postEditor.insertSectionAtEnd(newSection); - tailSection = newSection; - }); - } - - this._editor.selectRange(tailSection.tailPosition()); - - // ensure we're scrolled to the bottom - this.element.scrollTop = this.element.scrollHeight; - } - } - }, - - /* title related actions -------------------------------------------- */ - - onTitleCreated(titleElement) { - this._title = titleElement; - }, - - onTitleChange(newTitle) { - this.onTitleChange(newTitle); - }, - - onTitleFocusOut() { - this.onTitleBlur(); - }, - - onTitleKeydown(event) { - let value = event.target.value; - let selectionStart = event.target.selectionStart; - - // enter will always focus the editor - // down arrow will only focus the editor when the cursor is at the - // end of the input to preserve the default OS behaviour - if ( - event.key === 'Enter' || - event.key === 'Tab' || - ((event.key === 'ArrowDown' || event.key === 'ArrowRight') && (!value || selectionStart === value.length)) - ) { - event.preventDefault(); + this.mousedownY = event.clientY; + } - // on Enter we also want to create a blank para if necessary - if (event.key === 'Enter') { - this._addParaAtTop(); - } + // Title actions ----------------------------------------------------------- - this._editor.focus(); - } - }, + @action + registerTitleElement(element) { + this.titleElement = element; + } + + @action + updateTitle(event) { + this.args.onTitleChange?.(event.target.value); + } - /* body related actions --------------------------------------------- */ + @action + focusTitle() { + this.titleElement.focus(); + } - onEditorCreated(koenig) { - this._setupEditor(koenig); - this.onEditorCreated(koenig); - }, + @action + onTitleKeydown(event) { + let value = event.target.value; + let selectionStart = event.target.selectionStart; + + // enter will always focus the editor + // down arrow will only focus the editor when the cursor is at the + // end of the input to preserve the default OS behaviour + if ( + event.key === 'Enter' || + event.key === 'Tab' || + ((event.key === 'ArrowDown' || event.key === 'ArrowRight') && (!value || selectionStart === value.length)) + ) { + event.preventDefault(); + + // on Enter we also want to create a blank para if necessary + if (event.key === 'Enter') { + this._addParaAtTop(); + } - onBodyChange(newMobiledoc) { - this.onBodyChange(newMobiledoc); + this.koenigEditor.focus(); } - }, + } - /* public methods ------------------------------------------------------- */ + // Body actions ------------------------------------------------------------ - /* internal methods ----------------------------------------------------- */ + @action + onEditorCreated(koenig) { + this._setupEditor(koenig); + this.args.onEditorCreated?.(koenig); + } + + @action + focusEditor(event) { + if (event.target.classList.contains('gh-koenig-editor-pane')) { + let editorCanvas = this.koenigEditor.element; + let {bottom} = editorCanvas.getBoundingClientRect(); + + // if a mousedown and subsequent mouseup occurs below the editor + // canvas, focus the editor and put the cursor at the end of the + // document + if (this.mousedownY > bottom && event.clientY > bottom) { + let {post} = this.koenigEditor; + let range = post.toRange(); + let {tailSection} = range; + + event.preventDefault(); + this.koenigEditor.focus(); + + // we should always have a visible cursor when focusing + // at the bottom so create an empty paragraph if last + // section is a card + if (tailSection.isCardSection) { + this.koenigEditor.run((postEditor) => { + let newSection = postEditor.builder.createMarkupSection('p'); + postEditor.insertSectionAtEnd(newSection); + tailSection = newSection; + }); + } + + this.koenigEditor.selectRange(tailSection.tailPosition()); + + // ensure we're scrolled to the bottom + this.containerElement.scrollTop = this.containerElement.scrollHeight; + } + } + } _setupEditor(koenig) { let component = this; - this._koenig = koenig; - this._editor = koenig.editor; + this.koenigEditor = koenig.editor; // focus the title when pressing SHIFT+TAB - this._editor.registerKeyCommand({ + this.koenigEditor.registerKeyCommand({ str: 'SHIFT+TAB', run() { - component.send('focusTitle'); + component.focusTitle(); return true; } }); - }, + } _addParaAtTop() { - if (!this._editor) { + if (!this.koenigEditor) { return; } - let editor = this._editor; + let editor = this.koenigEditor; let section = editor.post.toRange().head.section; // create a blank paragraph at the top of the editor unless it's already @@ -157,4 +138,4 @@ export default Component.extend({ }); } } -}); +} From b979a2c41cb038424eea07fcbb1b975cb27d878b Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 27 May 2021 18:06:35 +0100 Subject: [PATCH 0390/3032] Changed editor title input to treat '(Untitled)' as blank refs https://github.com/TryGhost/Team/issues/707 - the switch to a hard `'(Untitled)'` when you start typing is jarring and pulls you away from writing to want to set a title - by changing the input to treat '(Untitled)' as a blank value the placeholder continues to be shown so flow isn't broken. Post validation and title display elsewhere in the app is unaffected because we're still setting `'(Untitled')` under the hood, it's only the editor display that changes --- app/components/gh-koenig-editor.hbs | 2 +- app/components/gh-koenig-editor.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/components/gh-koenig-editor.hbs b/app/components/gh-koenig-editor.hbs index a0bcd3b89f..72cceb127d 100644 --- a/app/components/gh-koenig-editor.hbs +++ b/app/components/gh-koenig-editor.hbs @@ -10,7 +10,7 @@ @placeholder={{@titlePlaceholder}} @tabindex="1" @autoExpand=".gh-koenig-editor" - @value={{readonly @title}} + @value={{readonly this.title}} @input={{this.updateTitle}} @focus-out={{optional @onTitleBlur}} @keyDown={{this.onTitleKeydown}} diff --git a/app/components/gh-koenig-editor.js b/app/components/gh-koenig-editor.js index 7e1f4e993c..647f8b3606 100644 --- a/app/components/gh-koenig-editor.js +++ b/app/components/gh-koenig-editor.js @@ -7,6 +7,10 @@ export default class GhKoenigEditorComponent extends Component { koenigEditor = null; mousedownY = 0; + get title() { + return this.args.title === '(Untitled)' ? '' : this.args.title; + } + @action registerElement(element) { this.containerElement = element; From 5bfd58f7c66d7e1949de07db2549b1ae0d8f18f9 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 27 May 2021 18:52:35 +0100 Subject: [PATCH 0391/3032] Fixed tests expecting `'(Untitled')` in editor title input refs https://github.com/TryGhost/Admin/commit/b979a2c41cb038424eea07fcbb1b975cb27d878b - updated to reflect changed behaviour --- tests/acceptance/editor-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/acceptance/editor-test.js b/tests/acceptance/editor-test.js index d5185496fa..4d2cdc8645 100644 --- a/tests/acceptance/editor-test.js +++ b/tests/acceptance/editor-test.js @@ -595,7 +595,7 @@ describe('Acceptance: Editor', function () { expect( find('[data-test-editor-title-input]').value, 'title value after autosave' - ).to.equal('(Untitled)'); + ).to.equal(''); expect( currentURL(), From 3e9d3781615cccbe525d624829ee9c9474da9ea1 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 27 May 2021 18:54:25 +0100 Subject: [PATCH 0392/3032] Enabled sourcemap build output in production no issue - production sourcemaps are needed to have reasonably readable stack traces in error reporting - will be excluded from Ghost release zips by `.npmignore` rules --- ember-cli-build.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ember-cli-build.js b/ember-cli-build.js index c5102bee63..cd1e7e85ac 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -195,6 +195,7 @@ module.exports = function (defaults) { ] } }, + sourcemaps: {enabled: true}, svgJar: { strategy: 'inline', stripPath: false, From 13fc1c7005f3d6c17f324bef7fe9204f62d6a891 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Thu, 27 May 2021 19:19:14 +0100 Subject: [PATCH 0393/3032] v4.6.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 790c67bdd5..96b4fcda11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.6.3", + "version": "4.6.4", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From e0612c506ab7423edb3485e951fe6e1ef67aefdb Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Tue, 1 Jun 2021 09:29:37 +0200 Subject: [PATCH 0394/3032] Added icon to staff user role dropdown field --- app/styles/patterns/forms.css | 18 ++++++++++++++++++ app/templates/staff/user.hbs | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/styles/patterns/forms.css b/app/styles/patterns/forms.css index b37e70ceaa..93b0da1719 100644 --- a/app/styles/patterns/forms.css +++ b/app/styles/patterns/forms.css @@ -117,6 +117,24 @@ input { /* Input Icons /* ---------------------------------------------------------- */ +.gh-input svg { + position: absolute; + top: 50%; + right: 1.2rem; + left: inherit; + width: 12px; + height: 6px; + margin-top: -0.2em; + transform: inherit; + pointer-events: none; + + speak: none; +} + +.gh-input svg path { + stroke: var(--midlightgrey); +} + .gh-input-icon { position: relative; display: block; diff --git a/app/templates/staff/user.hbs b/app/templates/staff/user.hbs index a38824e7f9..a4d88c5c78 100644 --- a/app/templates/staff/user.hbs +++ b/app/templates/staff/user.hbs @@ -199,7 +199,7 @@ {{#if this.rolesDropdownIsVisible}}
    -
    {{this.user.role.name}}
    +
    {{this.user.role.name}}{{svg-jar "arrow-down-small"}}

    What permissions should this user have?

    @@ -209,7 +209,7 @@ @model={{readonly this.user.role}} @confirm={{action "changeRole"}} @close={{action "toggleRoleSelectionModal"}} - @modifier="change-role" /> + @modifier="change-role" /> {{/if}} {{/if}} From 1320d82e39cb7033412189f2d1aafcd71769efcc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:06:34 +0100 Subject: [PATCH 0395/3032] Update dependency broccoli-funnel to v3.0.6 (#1979) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 27 ++++++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 96b4fcda11..c889c00afc 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "blueimp-md5": "2.18.0", "broccoli-asset-rev": "3.0.0", "broccoli-concat": "4.2.5", - "broccoli-funnel": "3.0.5", + "broccoli-funnel": "3.0.6", "broccoli-merge-trees": "4.2.0", "broccoli-terser-sourcemap": "4.1.0", "chai": "4.3.4", diff --git a/yarn.lock b/yarn.lock index 6725df7bc9..96fb4d890e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3723,20 +3723,17 @@ broccoli-funnel@2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@3.0.5, broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: - version "3.0.5" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.5.tgz#60da33d060fae2936b3d78217bd4008a6eea5e41" - integrity sha512-fcjvQIWq4lpKyzQ7FWRo/V8/nOALjIrAoRMFCLgFeO2xhOC1+i7QWbMndLTwpnLCoXpTa+luBu3WSFoxQ3VPlw== +broccoli-funnel@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.6.tgz#2216a802fc2f6d6875a66531cfbc07e4e4c22d6c" + integrity sha512-pJK+pO+2J6BYPiPNNAe16KiCK8SIVUHzjcDbtYMiAwGDhGrNXO91dm1Z/GOtpjqa3xmfm/IuQwMf01tW+FO2Ow== dependencies: array-equal "^1.0.0" - blank-object "^1.0.1" broccoli-plugin "^4.0.7" debug "^4.1.1" - fast-ordered-set "^1.0.0" fs-tree-diff "^2.0.1" heimdalljs "^0.2.0" minimatch "^3.0.0" - path-posix "^1.0.0" walk-sync "^2.0.2" broccoli-funnel@^1.0.1: @@ -3778,6 +3775,22 @@ broccoli-funnel@^1.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" +broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: + version "3.0.5" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.5.tgz#60da33d060fae2936b3d78217bd4008a6eea5e41" + integrity sha512-fcjvQIWq4lpKyzQ7FWRo/V8/nOALjIrAoRMFCLgFeO2xhOC1+i7QWbMndLTwpnLCoXpTa+luBu3WSFoxQ3VPlw== + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^4.0.7" + debug "^4.1.1" + fast-ordered-set "^1.0.0" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + path-posix "^1.0.0" + walk-sync "^2.0.2" + broccoli-kitchen-sink-helpers@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" From 9056ac7712a968f31cb282b5f9088d1fd81c05b2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:06:54 +0100 Subject: [PATCH 0396/3032] Update dependency ember-keyboard to v6.0.3 (#1981) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index c889c00afc..fe89cc6e09 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "ember-fetch": "8.0.4", "ember-in-viewport": "3.9.0", "ember-infinity": "2.2.0", - "ember-keyboard": "6.0.2", + "ember-keyboard": "6.0.3", "ember-load": "0.0.17", "ember-load-initializers": "2.1.2", "ember-mocha": "0.16.2", diff --git a/yarn.lock b/yarn.lock index 96fb4d890e..810e9aaf4c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5873,7 +5873,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, em resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@7.26.6, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.4, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@7.26.6, ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember-cli-babel@^7.12.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.2, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.4, ember-cli-babel@^7.26.6, ember-cli-babel@^7.4.1, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -6026,7 +6026,7 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" -ember-cli-htmlbars@5.7.1, ember-cli-htmlbars@^5.1.0, ember-cli-htmlbars@^5.1.2, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.3.2, ember-cli-htmlbars@^5.6.3: +ember-cli-htmlbars@5.7.1, ember-cli-htmlbars@^5.1.0, ember-cli-htmlbars@^5.1.2, ember-cli-htmlbars@^5.2.0, ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.3.2, ember-cli-htmlbars@^5.6.3, ember-cli-htmlbars@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== @@ -6446,7 +6446,7 @@ ember-cli@3.21.2: workerpool "^6.0.0" yam "^1.0.0" -ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: +ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1, ember-compatibility-helpers@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.4.tgz#70e0fef7048969141626eed6006f3880df612cd1" integrity sha512-qjzQVtogyYJrSs6I4DuyCDwDCaj5JWBVNPoZDZBk8pt7caNoN0eBYRYJdin95QKaNMQODxTLPWaI4UUDQ1YWhg== @@ -6694,15 +6694,15 @@ ember-inflector@^3.0.1: dependencies: ember-cli-babel "^6.6.0" -ember-keyboard@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-6.0.2.tgz#efe260be34621a403a4d4688b038d65b371f6892" - integrity sha512-ZGAXYGfN4gxGFRcv3ix2X8HA8j/VluwhlENT9pfbFjAAGtvFz9wzNUJuaq3LS5Ksj+f2oXL5f++tSOrO7Ha1wA== +ember-keyboard@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ember-keyboard/-/ember-keyboard-6.0.3.tgz#71485e0c1cd7b8a330bde4c173ad1b9767e32777" + integrity sha512-1JAoiiuccLOXPttKC8xv2qixGACf1LmGI55k/+YUaP4T/+eIPcBUrtikiS/tzz1qO597BM/7UwOc1szdCB3IXQ== dependencies: - ember-cli-babel "^7.22.1" - ember-cli-htmlbars "^5.3.1" - ember-compatibility-helpers "^1.2.1" - ember-modifier "^2.1.0" + ember-cli-babel "^7.26.6" + ember-cli-htmlbars "^5.7.1" + ember-compatibility-helpers "^1.2.4" + ember-modifier "^2.1.1" ember-load-initializers@2.1.2: version "2.1.2" @@ -6772,7 +6772,7 @@ ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0: ember-cli-version-checker "^2.1.2" ember-compatibility-helpers "^1.2.0" -ember-modifier@2.1.1, ember-modifier@^2.1.0: +ember-modifier@2.1.1, ember-modifier@^2.1.0, ember-modifier@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.1.tgz#aa3a12e2d6cf1622f774f3f1eab4880982a43fa9" integrity sha512-g9mcpFWgw5lgNU40YNf0USNWqoGTJ+EqjDQKjm7556gaRNDeGnLylFKqx9O3opwLHEt6ZODnRDy9U0S5YEMREg== From 2c05c5f1b1b0301f0feae8eacc9ed96ba4b1d0c8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:07:49 +0100 Subject: [PATCH 0397/3032] Update dependency papaparse to v5.3.1 (#1982) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index fe89cc6e09..378d6377a8 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "markdown-it-mark": "3.0.1", "matchdep": "2.0.0", "normalize.css": "3.0.3", - "papaparse": "5.3.0", + "papaparse": "5.3.1", "postcss-color-mod-function": "3.0.3", "postcss-custom-media": "7.0.8", "postcss-custom-properties": "10.0.0", diff --git a/yarn.lock b/yarn.lock index 810e9aaf4c..602110bbb2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11633,6 +11633,11 @@ papaparse@5.3.0: resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.0.tgz#ab1702feb96e79ab4309652f36db9536563ad05a" integrity sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg== +papaparse@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.1.tgz#770b7a9124d821d4b2132132b7bd7dce7194b5b1" + integrity sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA== + parallel-transform@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" From 3bb82169829fdd0b972a156c813c2eb685d9ed33 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:08:21 +0100 Subject: [PATCH 0398/3032] Update dependency testem to v3.4.2 (#1984) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 122 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 118 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 378d6377a8..45ce00428c 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "pretender": "3.4.3", "reframe.js": "3.0.3", "simplemde": "https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost", - "testem": "3.4.1", + "testem": "3.4.2", "top-gh-contribs": "2.0.4", "tracked-built-ins": "1.1.1", "validator": "7.2.0", diff --git a/yarn.lock b/yarn.lock index 602110bbb2..51df0d5e6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1869,6 +1869,11 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" integrity sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ== +"@types/component-emitter@^1.2.10": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea" + integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg== + "@types/connect@*": version "3.4.34" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" @@ -1876,6 +1881,16 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.0.tgz#14f854c0f93d326e39da6e3b6f34f7d37513d108" + integrity sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg== + +"@types/cors@^2.8.8": + version "2.8.10" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4" + integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ== + "@types/estree@*": version "0.0.47" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" @@ -1942,6 +1957,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.3.0.tgz#d6fed7d6bc6854306da3dea1af9f874b00783e26" integrity sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ== +"@types/node@>=10.0.0": + version "15.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08" + integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA== + "@types/node@^9.6.0": version "9.6.61" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.61.tgz#29f124eddd41c4c74281bd0b455d689109fc2a2d" @@ -3335,7 +3355,7 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0: +base64id@2.0.0, base64id@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== @@ -5092,6 +5112,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + cosmiconfig@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -5446,7 +5474,7 @@ debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@~4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -7117,6 +7145,13 @@ engine.io-parser@~2.2.0: blob "0.0.5" has-binary2 "~1.0.2" +engine.io-parser@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e" + integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg== + dependencies: + base64-arraybuffer "0.1.4" + engine.io@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" @@ -7129,6 +7164,19 @@ engine.io@~3.5.0: engine.io-parser "~2.2.0" ws "~7.4.2" +engine.io@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-5.1.1.tgz#a1f97e51ddf10cbd4db8b5ff4b165aad3760cdd3" + integrity sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~4.0.0" + ws "~7.4.2" + enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" @@ -11364,7 +11412,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@4.1.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@4.1.1, object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -13395,6 +13443,11 @@ socket.io-adapter@~1.1.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== +socket.io-adapter@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz#a442720cb09a4823cfb81287dda1f9b52d4ccdb2" + integrity sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw== + socket.io-client@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" @@ -13430,6 +13483,15 @@ socket.io-parser@~3.4.0: debug "~4.1.0" isarray "2.0.1" +socket.io-parser@~4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + socket.io@^2.1.0: version "2.4.1" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" @@ -13442,6 +13504,21 @@ socket.io@^2.1.0: socket.io-client "2.4.0" socket.io-parser "~3.4.0" +socket.io@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.1.2.tgz#f90f9002a8d550efe2aa1d320deebb9a45b83233" + integrity sha512-xK0SD1C7hFrh9+bYoYCdVt+ncixkSLKtNLCax5aEy1o3r5PaO5yQhVb97exIe67cE7lAK+EpyMytXWTWmyZY8w== + dependencies: + "@types/cookie" "^0.4.0" + "@types/cors" "^2.8.8" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.1" + engine.io "~5.1.0" + socket.io-adapter "~2.3.0" + socket.io-parser "~4.0.3" + sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -14037,7 +14114,42 @@ terser@^5.3.0: source-map "~0.7.2" source-map-support "~0.5.19" -testem@3.4.1, testem@^3.2.0: +testem@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.2.tgz#0ee3ca4025a9085d47230b0c797c815882d4029e" + integrity sha512-5undkzAltqE9fuLHy7c6Co/+pQWt0+03tsLpE97bx6ufymV9lJ1VkSO/tEfvQXk6XpLFcKTmbN/EM0RoK8FIOg== + dependencies: + backbone "^1.1.2" + bluebird "^3.4.6" + charm "^1.0.0" + commander "^2.6.0" + compression "^1.7.4" + consolidate "^0.15.1" + execa "^1.0.0" + express "^4.10.7" + fireworm "^0.7.0" + glob "^7.0.4" + http-proxy "^1.13.1" + js-yaml "^3.2.5" + lodash.assignin "^4.1.0" + lodash.castarray "^4.4.0" + lodash.clonedeep "^4.4.1" + lodash.find "^4.5.1" + lodash.uniqby "^4.7.0" + mkdirp "^0.5.1" + mustache "^3.0.0" + node-notifier "^9.0.1" + npmlog "^4.0.0" + printf "^0.6.1" + rimraf "^2.4.4" + socket.io "^4.1.2" + spawn-args "^0.2.0" + styled_string "0.0.1" + tap-parser "^7.0.0" + tmp "0.0.33" + xmldom "^0.6.0" + +testem@^3.2.0: version "3.4.1" resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.1.tgz#9b30c96001d08e590827a96fec1adb5df81792f8" integrity sha512-UhKbTAb8JF6xRoDXd0AL0wl+Rpmio6KN7q+Xv7O9fcuioAqOQQVCNyxkYrJaihUPRKGr/r8ZKtSGe/Gdkm3uGQ== @@ -14687,7 +14799,7 @@ validator@7.2.0: resolved "https://registry.yarnpkg.com/validator/-/validator-7.2.0.tgz#a63dcbaba51d4350bf8df20988e0d5a54d711791" integrity sha512-c8NGTUYeBEcUIGeMppmNVKHE7wwfm3mYbNZxV+c5mlv9fDHI7Ad3p07qfNrn/CvpdkK2k61fOLRO2sTEhgQXmg== -vary@~1.1.2: +vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= From 820e1e0cf040d453b6ba6ab6be583eb44e2b5c09 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:20:40 +0100 Subject: [PATCH 0399/3032] Update dependency ember-modifier to v2.1.2 (#1983) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 45ce00428c..2fe1759297 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "ember-load": "0.0.17", "ember-load-initializers": "2.1.2", "ember-mocha": "0.16.2", - "ember-modifier": "2.1.1", + "ember-modifier": "2.1.2", "ember-moment": "8.0.1", "ember-one-way-select": "4.0.1", "ember-power-calendar-moment": "0.1.7", diff --git a/yarn.lock b/yarn.lock index 51df0d5e6a..ad92d28aa0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6800,15 +6800,16 @@ ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0: ember-cli-version-checker "^2.1.2" ember-compatibility-helpers "^1.2.0" -ember-modifier@2.1.1, ember-modifier@^2.1.0, ember-modifier@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.1.tgz#aa3a12e2d6cf1622f774f3f1eab4880982a43fa9" - integrity sha512-g9mcpFWgw5lgNU40YNf0USNWqoGTJ+EqjDQKjm7556gaRNDeGnLylFKqx9O3opwLHEt6ZODnRDy9U0S5YEMREg== +ember-modifier@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.2.tgz#62d18faedf972dcd9d34f90d5321fbc943d139b1" + integrity sha512-3Lsu1fV1sIGa66HOW07RZc6EHISwKt5VA5AUnFss2HX6OTfpxTJ2qvPctt2Yt0XPQXJ4G6BQasr/F35CX7UGJA== dependencies: ember-cli-babel "^7.22.1" ember-cli-normalize-entity-name "^1.0.0" ember-cli-string-utils "^1.1.0" ember-cli-typescript "^3.1.3" + ember-compatibility-helpers "^1.2.4" ember-destroyable-polyfill "^2.0.2" ember-modifier-manager-polyfill "^1.2.0" @@ -6824,6 +6825,18 @@ ember-modifier@^1.0.2: ember-compatibility-helpers "^1.2.1" ember-modifier-manager-polyfill "^1.2.0" +ember-modifier@^2.1.0, ember-modifier@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.1.tgz#aa3a12e2d6cf1622f774f3f1eab4880982a43fa9" + integrity sha512-g9mcpFWgw5lgNU40YNf0USNWqoGTJ+EqjDQKjm7556gaRNDeGnLylFKqx9O3opwLHEt6ZODnRDy9U0S5YEMREg== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-normalize-entity-name "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "^3.1.3" + ember-destroyable-polyfill "^2.0.2" + ember-modifier-manager-polyfill "^1.2.0" + ember-moment@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.1.tgz#3a11929efeb7fb6bc5c1cc2c9e4c43bd9c500f80" From fea76ffcd119180fbf07e611ee15c3e70c6afef0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:20:54 +0100 Subject: [PATCH 0400/3032] Update dependency @sentry/ember to v6.5.0 (#1985) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 106 +++++++++++++++++++++++++-------------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 2fe1759297..3ce9722a2a 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "2.0.0", - "@sentry/ember": "6.4.1", + "@sentry/ember": "6.5.0", "@tryghost/helpers": "1.1.45", "@tryghost/kg-clean-basic-html": "1.0.17", "@tryghost/kg-parser-plugins": "1.1.7", diff --git a/yarn.lock b/yarn.lock index ad92d28aa0..ad8a7195a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1667,82 +1667,82 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" -"@sentry/browser@6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.4.1.tgz#b6c62736caaade7fdf6638513d9aad138abde2ac" - integrity sha512-3cDud6GWutnJqcnheIq0lPNTsUJbrRLevQ+g1YfawVXFUxfmmY2bOsGd/Mxq17LxYeBHgKTitXv3DU1bsQ+WBQ== - dependencies: - "@sentry/core" "6.4.1" - "@sentry/types" "6.4.1" - "@sentry/utils" "6.4.1" +"@sentry/browser@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.5.0.tgz#2382493691c3fac5d8b652ae46f09f1b29d288ef" + integrity sha512-n1e8hNKwuVP4bLqRK5J0DHFqnnnrbv6h6+Bc1eNRbf32/e6eZ3Cb36PTplqDCxwnMnnIEEowd5F4ZWeTLPPY3A== + dependencies: + "@sentry/core" "6.5.0" + "@sentry/types" "6.5.0" + "@sentry/utils" "6.5.0" tslib "^1.9.3" -"@sentry/core@6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.4.1.tgz#789b0071996de5c1a20673f879408926aa3b4fa6" - integrity sha512-Lx13oTiP+Tjvm5VxulcCszNVd2S1wY4viSnr+ygq62ySVERR+t7uOZDSARZ0rZ259GwW6nkbMh9dDmD0d6VCGQ== +"@sentry/core@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.5.0.tgz#03ecbad7845b31f03a84eddf4884877c999bb6be" + integrity sha512-Hx/WvhM5bXcXqfIiz+505TjYYfPjQ8mrxby/EWl+L7dYUCyI/W6IZKTc/MoHlLuM+JPUW9c1bw/97TzbgTzaAA== dependencies: - "@sentry/hub" "6.4.1" - "@sentry/minimal" "6.4.1" - "@sentry/types" "6.4.1" - "@sentry/utils" "6.4.1" + "@sentry/hub" "6.5.0" + "@sentry/minimal" "6.5.0" + "@sentry/types" "6.5.0" + "@sentry/utils" "6.5.0" tslib "^1.9.3" -"@sentry/ember@6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@sentry/ember/-/ember-6.4.1.tgz#632c739942dd29311b83f0b6d4344dee4c2eddb4" - integrity sha512-e3N5EK+mtZGqIk4wkt1E3Wh5beKuGlydSuNrTSaAJcJ45I8kyZ93mX47yjs4uyrY7eSiDYLQqUBu683YhInwZQ== +"@sentry/ember@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@sentry/ember/-/ember-6.5.0.tgz#ccdab6c344557139ce492211c56a7b374ad64860" + integrity sha512-8Q8f7UeP1GWdGZmNnl8wSOrZy7psLYrCbHwlZRHQUYla2ZwiqRM/GEOkfeJQ085o7QDDAKUfzjGaWdLmJ2vdYA== dependencies: "@embroider/macros" "~0.37.0" - "@sentry/browser" "6.4.1" - "@sentry/tracing" "6.4.1" - "@sentry/types" "6.4.1" - "@sentry/utils" "6.4.1" + "@sentry/browser" "6.5.0" + "@sentry/tracing" "6.5.0" + "@sentry/types" "6.5.0" + "@sentry/utils" "6.5.0" ember-auto-import "^1.6.0" ember-cli-babel "^7.20.5" ember-cli-htmlbars "^5.1.2" ember-cli-typescript "^3.1.4" -"@sentry/hub@6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.4.1.tgz#fa9c05ca32674e2e8477120b71084a1c91a5e023" - integrity sha512-7IZRP5buDE6s/c3vWzzPR/ySE+8GUuHPgTEPiDCPOCWwUN11zXDafJDKkJqY3muJfebUKmC/JG67RyBx+XlnlQ== +"@sentry/hub@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.5.0.tgz#ad3c9bcf83050ea217f3c25cc625e6b447f1d9d7" + integrity sha512-vEChnLoozOJzEJoTUvaAsK/n7IHoQFx8P1TzQmnR+8XGZJZmGHG6bBXUH0iS2a9hhR1WkoEBeiL+t96R9uyf0A== dependencies: - "@sentry/types" "6.4.1" - "@sentry/utils" "6.4.1" + "@sentry/types" "6.5.0" + "@sentry/utils" "6.5.0" tslib "^1.9.3" -"@sentry/minimal@6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.4.1.tgz#d3f968c060c3d3cc997071756659e24047b5dd97" - integrity sha512-4x/PRbDZACCKJqjta9EkhiIMyGMf7VgBX13EEWEDVWLP7ymFukBuTr4ap/Tz9429kB/yXZuDGGMIZp/G618H3g== +"@sentry/minimal@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.5.0.tgz#aa89b8e24c88aa85c99ef64e0b460497c90133f9" + integrity sha512-MT83ONaBhTCFUlDIQFpsG/lq3ZjGK7jwQ10qxGadSg1KW6EvtQRg+OBwULeQ7C+nNEAhseNrC/qomZMT8brncg== dependencies: - "@sentry/hub" "6.4.1" - "@sentry/types" "6.4.1" + "@sentry/hub" "6.5.0" + "@sentry/types" "6.5.0" tslib "^1.9.3" -"@sentry/tracing@6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.4.1.tgz#3a9119e1ef5206ea565854c325b19a317cc1cca7" - integrity sha512-EPRadE9n/wpUjx4jqP/8vXdOAZBk7vjlzRKniJgKgQUO3v03i0ui6xydaal2mvhplIyOCI2muXdGhjUO7ga4uw== +"@sentry/tracing@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.5.0.tgz#4d8efce53362a820d002838495f0ef446150aefc" + integrity sha512-6jpmYM3Lt4w6dOeK8keGAis722ooLtX5UcPbekkTufXiqKRR5VWg8DLUp7z7oD6h4GLrLbeNtCiH6h20ZW2ggw== dependencies: - "@sentry/hub" "6.4.1" - "@sentry/minimal" "6.4.1" - "@sentry/types" "6.4.1" - "@sentry/utils" "6.4.1" + "@sentry/hub" "6.5.0" + "@sentry/minimal" "6.5.0" + "@sentry/types" "6.5.0" + "@sentry/utils" "6.5.0" tslib "^1.9.3" -"@sentry/types@6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.4.1.tgz#7c0a4355a1d04321b901197723a8f55c263226e9" - integrity sha512-sTu/GaLsLYk1AkAqpkMT4+4q665LtZjhV0hkgiTD4N3zPl5uSf1pCIzxPRYjOpe7NEANmWv8U4PaGKGtc2eMfA== +"@sentry/types@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.5.0.tgz#2cdb50875bb73d87708b9c0a80d4ca057b3596b5" + integrity sha512-yQpTCIYxBsYT0GenqHNNKeXV8CSkkYlAxB1IGV2eac4IKC5ph5GW6TfDGwvlzQSQ297RsRmOSA8o3I5gGPd2yA== -"@sentry/utils@6.4.1": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.4.1.tgz#55fa7da58898773cbd538e4895fc2e4ec695ecab" - integrity sha512-xJ1uVa5fvg23pXQfulvCIBb9pQ3p1awyd1PapK2AYi+wKjTuYl4B9edmhjRREEQEExznl/d2OVm78fRXLq7M9Q== +"@sentry/utils@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.5.0.tgz#8722542b9a901623195cffaab5d18ce176c1e459" + integrity sha512-CcHuaQN6vRuAsIC+3sA23NmWLRmUN0x/HNQxk0DHJylvYQdEA0AUNoLXogykaXh6NrCx4DNq9yCQTNTSC3mFxg== dependencies: - "@sentry/types" "6.4.1" + "@sentry/types" "6.5.0" tslib "^1.9.3" "@simple-dom/interface@^1.4.0": From 4465c19ec376261732a021182b32dac1b8aa75f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:22:09 +0100 Subject: [PATCH 0401/3032] Update dependency markdown-it-footnote to v3.0.3 (#1971) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3ce9722a2a..0fd317eb03 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "liquid-wormhole": "2.1.5", "loader.js": "4.7.0", "markdown-it": "12.0.6", - "markdown-it-footnote": "3.0.2", + "markdown-it-footnote": "3.0.3", "markdown-it-lazy-headers": "0.1.3", "markdown-it-mark": "3.0.1", "matchdep": "2.0.0", diff --git a/yarn.lock b/yarn.lock index ad8a7195a4..f797b90d5d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10637,10 +10637,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it-footnote@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/markdown-it-footnote/-/markdown-it-footnote-3.0.2.tgz#1575ee7a093648d4e096aa33386b058d92ac8bc1" - integrity sha512-JVW6fCmZWjvMdDQSbOT3nnOQtd9iAXmw7hTSh26+v42BnvXeVyGMDBm5b/EZocMed2MbCAHiTX632vY0FyGB8A== +markdown-it-footnote@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz#e0e4c0d67390a4c5f0c75f73be605c7c190ca4d8" + integrity sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w== markdown-it-lazy-headers@0.1.3: version "0.1.3" From f97cc2fee34173774516b46cdcecc1008c0fb705 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 09:43:20 +0100 Subject: [PATCH 0402/3032] Lock file maintenance (#1986) Co-authored-by: Renovate Bot --- yarn.lock | 695 +++++++++++++++++++----------------------------------- 1 file changed, 241 insertions(+), 454 deletions(-) diff --git a/yarn.lock b/yarn.lock index f797b90d5d..64803d4bc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,10 +16,10 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" - integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" + integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.11.0", "@babel/core@^7.12.0", "@babel/core@^7.12.16", "@babel/core@^7.12.3", "@babel/core@^7.13.10", "@babel/core@^7.3.4", "@babel/core@^7.8.7", "@babel/core@^7.9.0": version "7.14.3" @@ -43,9 +43,9 @@ source-map "^0.5.0" "@babel/eslint-parser@^7.12.16": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.14.3.tgz#8f292caf83dd2d7b364f938fe7074806af6d70ea" - integrity sha512-IfJXKEVRV/Gisvgmih/+05gkBzzg4Dy0gcxkZ84iFiLK8+O+fI1HLnGJv3UrUMPpsMmmThNa69v+UnF80XP+kA== + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.14.4.tgz#73e6996163a2ad48f315a8466b55f57c330cd15c" + integrity sha512-7CTckFLPBGEfCKqlrnJq2PIId3UmJ5hW+D4dsv/VvuA5DapgqyZFCttq+8oeRIJMZQizFIe5gel3xm2SbrqlYA== dependencies: eslint-scope "^5.1.0" eslint-visitor-keys "^2.1.0" @@ -75,26 +75,26 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.8.7": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== +"@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.14.4", "@babel/helper-compilation-targets@^7.8.7": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" + integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== dependencies: - "@babel/compat-data" "^7.13.15" + "@babel/compat-data" "^7.14.4" "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.2", "@babel/helper-create-class-features-plugin@^7.14.3", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz#832111bcf4f57ca57a4c5b1a000fc125abc6554a" - integrity sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.2", "@babel/helper-create-class-features-plugin@^7.14.3", "@babel/helper-create-class-features-plugin@^7.14.4", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz#abf888d836a441abee783c75229279748705dc42" + integrity sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" "@babel/helper-function-name" "^7.14.2" "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.14.3" + "@babel/helper-replace-supers" "^7.14.4" "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.12.13": @@ -105,10 +105,10 @@ "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" - integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -199,15 +199,15 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600" - integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA== +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836" + integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ== dependencies: "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/types" "^7.14.4" "@babel/helper-simple-access@^7.13.12": version "7.13.12" @@ -269,9 +269,9 @@ js-tokens "^4.0.0" "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0", "@babel/parser@^7.8.7": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" - integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" + integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" @@ -299,7 +299,7 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-class-static-block@^7.13.11": +"@babel/plugin-proposal-class-static-block@^7.14.3": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== @@ -365,13 +365,13 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz#e17d418f81cc103fedd4ce037e181c8056225abc" - integrity sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw== +"@babel/plugin-proposal-object-rest-spread@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz#0e2b4de419915dc0b409378e829412e2031777c4" + integrity sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA== dependencies: - "@babel/compat-data" "^7.14.0" - "@babel/helper-compilation-targets" "^7.13.16" + "@babel/compat-data" "^7.14.4" + "@babel/helper-compilation-targets" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.14.2" @@ -554,23 +554,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.14.2", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz#761cb12ab5a88d640ad4af4aa81f820e6b5fdf5c" - integrity sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg== +"@babel/plugin-transform-block-scoping@^7.14.4", "@babel/plugin-transform-block-scoping@^7.8.3": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz#caf140b0b2e2462c509553d140e6d0abefb61ed8" + integrity sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-classes@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz#3f1196c5709f064c252ad056207d87b7aeb2d03d" - integrity sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg== +"@babel/plugin-transform-classes@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz#a83c15503fc71a0f99e876fdce7dadbc6575ec3a" + integrity sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" "@babel/helper-function-name" "^7.14.2" "@babel/helper-optimise-call-expression" "^7.12.13" "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-replace-supers" "^7.14.4" "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" @@ -581,10 +581,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" - integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== +"@babel/plugin-transform-destructuring@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz#acbec502e9951f30f4441eaca1d2f29efade59ed" + integrity sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -784,11 +784,11 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-typescript@^7.13.0", "@babel/plugin-transform-typescript@^7.9.0": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.3.tgz#44f67f725a60cccee33d9d6fee5e4f338258f34f" - integrity sha512-G5Bb5pY6tJRTC4ag1visSgiDoGgJ1u1fMUgmc2ijLkcIdzP83Q1qyZX4ggFQ/SkR+PNOatkaYC+nKcTlpsX4ag== + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.4.tgz#1c48829fa6d5f2de646060cd08abb6cda4b521a7" + integrity sha512-WYdcGNEO7mCCZ2XzRlxwGj3PgeAr50ifkofOUC/+IN/GzKLB+biDPVBUAQN2C/dVZTvEXCp80kfQ1FFZPrwykQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.3" + "@babel/helper-create-class-features-plugin" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-typescript" "^7.12.13" @@ -842,25 +842,25 @@ regenerator-runtime "^0.13.4" "@babel/preset-env@^7.10.2", "@babel/preset-env@^7.12.0", "@babel/preset-env@^7.9.0": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.2.tgz#e80612965da73579c84ad2f963c2359c71524ed5" - integrity sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ== + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.4.tgz#73fc3228c59727e5e974319156f304f0d6685a2d" + integrity sha512-GwMMsuAnDtULyOtuxHhzzuSRxFeP0aR/LNzrHRzP8y6AgDNgqnrfCCBm/1cRdTU75tRs28Eh76poHLcg9VF0LA== dependencies: - "@babel/compat-data" "^7.14.0" - "@babel/helper-compilation-targets" "^7.13.16" + "@babel/compat-data" "^7.14.4" + "@babel/helper-compilation-targets" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-validator-option" "^7.12.17" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" "@babel/plugin-proposal-async-generator-functions" "^7.14.2" "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-class-static-block" "^7.13.11" + "@babel/plugin-proposal-class-static-block" "^7.14.3" "@babel/plugin-proposal-dynamic-import" "^7.14.2" "@babel/plugin-proposal-export-namespace-from" "^7.14.2" "@babel/plugin-proposal-json-strings" "^7.14.2" "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" "@babel/plugin-proposal-numeric-separator" "^7.14.2" - "@babel/plugin-proposal-object-rest-spread" "^7.14.2" + "@babel/plugin-proposal-object-rest-spread" "^7.14.4" "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" "@babel/plugin-proposal-optional-chaining" "^7.14.2" "@babel/plugin-proposal-private-methods" "^7.13.0" @@ -883,10 +883,10 @@ "@babel/plugin-transform-arrow-functions" "^7.13.0" "@babel/plugin-transform-async-to-generator" "^7.13.0" "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.14.2" - "@babel/plugin-transform-classes" "^7.14.2" + "@babel/plugin-transform-block-scoping" "^7.14.4" + "@babel/plugin-transform-classes" "^7.14.4" "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.17" + "@babel/plugin-transform-destructuring" "^7.14.4" "@babel/plugin-transform-dotall-regex" "^7.12.13" "@babel/plugin-transform-duplicate-keys" "^7.12.13" "@babel/plugin-transform-exponentiation-operator" "^7.12.13" @@ -913,7 +913,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.12.13" "@babel/plugin-transform-unicode-regex" "^7.12.13" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.2" + "@babel/types" "^7.14.4" babel-plugin-polyfill-corejs2 "^0.2.0" babel-plugin-polyfill-corejs3 "^0.2.0" babel-plugin-polyfill-regenerator "^0.2.0" @@ -968,10 +968,10 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.7": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" - integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== +"@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2", "@babel/types@^7.8.7": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" + integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== dependencies: "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" @@ -1783,6 +1783,11 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@tryghost/helpers@1.1.45": version "1.1.45" resolved "https://registry.yarnpkg.com/@tryghost/helpers/-/helpers-1.1.45.tgz#811c1d4c5a8a4f3e513b26dd893fa061d3c9afb1" @@ -1897,18 +1902,18 @@ integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== "@types/express-serve-static-core@^4.17.18": - version "4.17.19" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" - integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.20.tgz#44caee029f2c26c46711da5e845cdc12167ad72d" + integrity sha512-8qqFN4W53IEWa9bdmuVrUcVkFemQWnt5DKPQ/oa8xKDYgtjCr2OO6NX5TIK49NLFr3mPYU2cLh92DQquC3oWWQ== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@^4.17.2": - version "4.17.11" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.11.tgz#debe3caa6f8e5fcda96b47bd54e2f40c4ee59545" - integrity sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg== + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.12.tgz#4bc1bf3cd0cfe6d3f6f2853648b40db7d54de350" + integrity sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.18" @@ -1952,12 +1957,7 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== -"@types/node@*": - version "15.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.3.0.tgz#d6fed7d6bc6854306da3dea1af9f874b00783e26" - integrity sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ== - -"@types/node@>=10.0.0": +"@types/node@*", "@types/node@>=10.0.0": version "15.6.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08" integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA== @@ -2239,15 +2239,17 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0: - version "8.2.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0" - integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg== +acorn@^8.2.4: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88" + integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" ajv-errors@^1.0.0: version "1.0.1" @@ -2270,9 +2272,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.1: - version "8.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.4.0.tgz#48984fdb2ce225cab15795f0772a8d85669075e4" - integrity sha512-7QD2l6+KBSLwf+7MuYocbWvRPdOu63/trReTLu2KFwkgctnub1auoF+Y1WYcm09CTM7quuscrzqmASaLHC/K4Q== + version "8.5.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" + integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2482,11 +2484,6 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -2945,28 +2942,28 @@ babel-plugin-module-resolver@^4.0.0: resolve "^1.13.1" babel-plugin-polyfill-corejs2@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" - integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" - integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5" + integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.9.1" babel-plugin-polyfill-regenerator@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" - integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -3330,11 +3327,6 @@ backbone@^1.1.2: dependencies: underscore ">=1.8.3" -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -3424,11 +3416,6 @@ blank-object@^1.0.1: resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - bluebird@^3.1.1, bluebird@^3.3.5, bluebird@^3.4.6, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -3743,7 +3730,7 @@ broccoli-funnel@2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@3.0.6: +broccoli-funnel@3.0.6, broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: version "3.0.6" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.6.tgz#2216a802fc2f6d6875a66531cfbc07e4e4c22d6c" integrity sha512-pJK+pO+2J6BYPiPNNAe16KiCK8SIVUHzjcDbtYMiAwGDhGrNXO91dm1Z/GOtpjqa3xmfm/IuQwMf01tW+FO2Ow== @@ -3795,22 +3782,6 @@ broccoli-funnel@^1.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^3.0.0, broccoli-funnel@^3.0.3: - version "3.0.5" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.5.tgz#60da33d060fae2936b3d78217bd4008a6eea5e41" - integrity sha512-fcjvQIWq4lpKyzQ7FWRo/V8/nOALjIrAoRMFCLgFeO2xhOC1+i7QWbMndLTwpnLCoXpTa+luBu3WSFoxQ3VPlw== - dependencies: - array-equal "^1.0.0" - blank-object "^1.0.1" - broccoli-plugin "^4.0.7" - debug "^4.1.1" - fast-ordered-set "^1.0.0" - fs-tree-diff "^2.0.1" - heimdalljs "^0.2.0" - minimatch "^3.0.0" - path-posix "^1.0.0" - walk-sync "^2.0.2" - broccoli-kitchen-sink-helpers@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06" @@ -3891,9 +3862,9 @@ broccoli-node-info@^1.1.0: integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= broccoli-node-info@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-2.1.0.tgz#ca84560e8570ff78565bea1699866ddbf58ad644" - integrity sha512-l6qDuboJThHfRVVWQVaTs++bFdrFTP0gJXgsWenczc1PavRVUmL1Eyb2swTAXXMpDOnr2zhNOBLx4w9AxkqbPQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-2.2.0.tgz#feb01c13020792f429e01d7f7845dc5b3a7932b3" + integrity sha512-VabSGRpKIzpmC+r+tJueCE5h8k6vON7EIMMWu6d/FyPdtijwLQ7QvzShEw+m3mHoDzUaj/kiZsDYrS8X2adsBg== broccoli-output-wrapper@^2.0.0: version "2.0.0" @@ -4307,7 +4278,7 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6: version "4.16.6" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== @@ -4480,9 +4451,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: - version "1.0.30001228" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" - integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== + version "1.0.30001232" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001232.tgz#2ebc8b6a77656fd772ab44a82a332a26a17e9527" + integrity sha512-e4Gyp7P8vqC2qV2iHA+cJNf/yqUKOShXQOJHQt81OHxlIZl/j/j3soEA0adAQi8CPUQgvOdDENyQ5kd6a6mNSg== capture-exit@^2.0.0: version "2.0.0" @@ -4666,9 +4637,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a" - integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -4872,7 +4843,7 @@ colors@~1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -4916,26 +4887,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - component-emitter@^1.2.1, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -5088,9 +5044,9 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.9.0, core-js-compat@^3.9.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.12.1.tgz#2c302c4708505fa7072b0adb5156d26f7801a18b" - integrity sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ== + version "3.13.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.13.1.tgz#05444caa8f153be0c67db03cf8adb8ec0964e58e" + integrity sha512-mdrcxc0WznfRd8ZicEZh1qVeJ2mu6bwQFh8YVUK48friy/FOwFV5EJj9/dlh+nMQ74YusdVfBFDuomKgUspxWQ== dependencies: browserslist "^4.16.6" semver "7.0.0" @@ -5467,31 +5423,17 @@ debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" -debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@~4.3.1: +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@~4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" @@ -5606,9 +5548,9 @@ detect-indent@^4.0.0: repeating "^2.0.0" detect-indent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" - integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detect-newline@3.1.0: version "3.1.0" @@ -5773,9 +5715,9 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.723: - version "1.3.731" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.731.tgz#9f17f7e16f798eaddb21409d80aa755b5b5053dc" - integrity sha512-dn1Nyd0DuFa3xhqZJr6/L9phyk+YXJpvrz6Vcu6mFxFqr5TQ9r/F3yvOYFUrEwY4Tbb1YBjN19TDKnSVCQvalA== + version "1.3.743" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.743.tgz#fcec24d6d647cb84fd796b42caa1b4039a180894" + integrity sha512-K2wXfo9iZQzNJNx67+Pld0DRF+9bYinj62gXCdgPhcu1vidwVuLPHQPPFnCdO55njWigXXpfBiT90jGUPbw8Zg== element-closest@^3.0.2: version "3.0.2" @@ -6769,9 +6711,9 @@ ember-maybe-import-regenerator@^0.1.6: regenerator-runtime "^0.9.5" ember-maybe-in-element@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-2.0.2.tgz#93e503fb0655b65cc822e4040e51e13814b5f648" - integrity sha512-NyZNEGsdUHKUbpeZV0U6fbs0KaRKaa6O6E3RP3TMoqUA/NI3Fhha28kZ38aPe21KMgN4I1NHicgSHf4ijuHFsA== + version "2.0.3" + resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-2.0.3.tgz#640ea56b492bdacd1c41c128c2163d933c18c3ec" + integrity sha512-XKuBYPYELwsEmDnJXI7aNSZtt/SKGgRZNMFhASODLz7j0OHSNrcJtjo5Wam/alxIjUIYVjEnMnOzqBLMfJnQkQ== dependencies: ember-cli-babel "^7.21.0" ember-cli-htmlbars "^5.2.0" @@ -6800,7 +6742,7 @@ ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0: ember-cli-version-checker "^2.1.2" ember-compatibility-helpers "^1.2.0" -ember-modifier@2.1.2: +ember-modifier@2.1.2, ember-modifier@^2.1.0, ember-modifier@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.2.tgz#62d18faedf972dcd9d34f90d5321fbc943d139b1" integrity sha512-3Lsu1fV1sIGa66HOW07RZc6EHISwKt5VA5AUnFss2HX6OTfpxTJ2qvPctt2Yt0XPQXJ4G6BQasr/F35CX7UGJA== @@ -6825,18 +6767,6 @@ ember-modifier@^1.0.2: ember-compatibility-helpers "^1.2.1" ember-modifier-manager-polyfill "^1.2.0" -ember-modifier@^2.1.0, ember-modifier@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.1.tgz#aa3a12e2d6cf1622f774f3f1eab4880982a43fa9" - integrity sha512-g9mcpFWgw5lgNU40YNf0USNWqoGTJ+EqjDQKjm7556gaRNDeGnLylFKqx9O3opwLHEt6ZODnRDy9U0S5YEMREg== - dependencies: - ember-cli-babel "^7.22.1" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-typescript "^3.1.3" - ember-destroyable-polyfill "^2.0.2" - ember-modifier-manager-polyfill "^1.2.0" - ember-moment@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.1.tgz#3a11929efeb7fb6bc5c1cc2c9e4c43bd9c500f80" @@ -6879,6 +6809,7 @@ ember-power-calendar@^0.16.3: ember-power-datepicker@cibernox/ember-power-datepicker: version "0.8.1" + uid da580474a2c449b715444934ddb626b7c07f46a7 resolved "https://codeload.github.com/cibernox/ember-power-datepicker/tar.gz/da580474a2c449b715444934ddb626b7c07f46a7" dependencies: ember-basic-dropdown "^3.0.11" @@ -7130,34 +7061,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-client@~3.5.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.2.tgz#0ef473621294004e9ceebe73cef0af9e36f2f5fa" - integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA== - dependencies: - component-emitter "~1.3.0" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.2.0" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~7.4.2" - xmlhttprequest-ssl "~1.6.2" - yeast "0.1.2" - -engine.io-parser@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" - integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.4" - blob "0.0.5" - has-binary2 "~1.0.2" - engine.io-parser@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e" @@ -7165,18 +7068,6 @@ engine.io-parser@~4.0.0: dependencies: base64-arraybuffer "0.1.4" -engine.io@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" - integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== - dependencies: - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - debug "~4.1.0" - engine.io-parser "~2.2.0" - ws "~7.4.2" - engine.io@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-5.1.1.tgz#a1f97e51ddf10cbd4db8b5ff4b165aad3760cdd3" @@ -7257,10 +7148,10 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.17.2, es-abstract@^1.18.0-next.2: - version "1.18.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" - integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== +es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -7270,14 +7161,14 @@ es-abstract@^1.17.2, es-abstract@^1.18.0-next.2: has-symbols "^1.0.2" is-callable "^1.2.3" is-negative-zero "^2.0.1" - is-regex "^1.1.2" - is-string "^1.0.5" - object-inspect "^1.9.0" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.0" + unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -8294,6 +8185,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -8303,10 +8203,10 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fragment-cache@^0.2.1: version "0.2.1" @@ -8651,9 +8551,9 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0: - version "13.8.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" - integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== + version "13.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" + integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== dependencies: type-fest "^0.20.2" @@ -8685,6 +8585,7 @@ gonzales-pe@4.2.4: "google-caja-bower@https://github.com/acburdine/google-caja-bower#ghost": version "6011.0.0" + uid "275cb75249f038492094a499756a73719ae071fd" resolved "https://github.com/acburdine/google-caja-bower#275cb75249f038492094a499756a73719ae071fd" got@^8.0.1: @@ -8731,21 +8632,16 @@ growly@^1.3.0: integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= grunt-cli@~1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.2.tgz#8a83dcc89ebd92d278ccd6014105011cffc71165" - integrity sha512-wsu6BZh7KCnfeaSkDrKIAvOlqGKxNRTZjc8xfZlvxCByQIqUfZ31kh5uHpPnhQ4NdVgvaWaVxa1LUbVU80nACw== + version "1.4.3" + resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.3.tgz#22c9f1a3d2780bf9b0d206e832e40f8f499175ff" + integrity sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ== dependencies: - grunt-known-options "~1.1.1" + grunt-known-options "~2.0.0" interpret "~1.1.0" liftup "~3.0.1" nopt "~4.0.1" v8flags "~3.2.0" -grunt-known-options@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d" - integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ== - grunt-known-options@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-2.0.0.tgz#cac641e897f9a0a680b8c9839803d35f3325103c" @@ -8856,18 +8752,6 @@ has-bigints@^1.0.1: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -9126,6 +9010,15 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-proxy@^1.13.1, http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" @@ -9149,6 +9042,14 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" @@ -9222,11 +9123,6 @@ indexes-of@^1.0.1: resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - infer-owner@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -9621,7 +9517,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-potential-custom-element-name@^1.0.0: +is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== @@ -9633,7 +9529,7 @@ is-reference@^1.1.0: dependencies: "@types/estree" "*" -is-regex@^1.1.2: +is-regex@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== @@ -9668,7 +9564,7 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.5: +is-string@^1.0.5, is-string@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== @@ -9731,11 +9627,6 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= - isbinaryfile@^4.0.6: version "4.0.8" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" @@ -9867,12 +9758,12 @@ jsdom@^12.0.0: xml-name-validator "^3.0.0" jsdom@^16.4.0: - version "16.5.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136" - integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== dependencies: abab "^2.0.5" - acorn "^8.1.0" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" cssstyle "^2.3.0" @@ -9880,12 +9771,13 @@ jsdom@^16.4.0: decimal.js "^10.2.1" domexception "^2.0.1" escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" parse5 "6.0.1" - request "^2.88.2" - request-promise-native "^1.0.9" saxes "^5.0.1" symbol-tree "^3.2.4" tough-cookie "^4.0.0" @@ -9895,7 +9787,7 @@ jsdom@^16.4.0: whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.5.0" - ws "^7.4.4" + ws "^7.4.5" xml-name-validator "^3.0.0" jsesc@^1.3.0: @@ -10029,6 +9921,7 @@ just-extend@^4.0.2: "keymaster@https://github.com/madrobby/keymaster.git": version "1.6.3" + uid f8f43ddafad663b505dc0908e72853bcf8daea49 resolved "https://github.com/madrobby/keymaster.git#f8f43ddafad663b505dc0908e72853bcf8daea49" keyv@3.0.0: @@ -10875,11 +10768,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.47.0: version "1.47.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +"mime-db@>= 1.43.0 < 2": + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== + mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.26, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.30" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" @@ -11444,7 +11342,7 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.9.0: +object-inspect@^1.10.3, object-inspect@^1.9.0: version "1.10.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== @@ -11506,14 +11404,13 @@ object.pick@^1.2.0, object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" - integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + es-abstract "^1.18.2" on-finished@~2.3.0: version "2.3.0" @@ -11778,16 +11675,6 @@ parse5@6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -11839,9 +11726,9 @@ path-key@^3.0.0, path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-posix@^1.0.0: version "1.0.0" @@ -11906,9 +11793,9 @@ performance-now@^2.1.0: integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" - integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pify@^2.3.0: version "2.3.0" @@ -12413,11 +12300,11 @@ promise.hash.helper@^1.0.6: integrity sha512-0qhWYyCV9TYDMSooYw1fShIb7R6hsWYja7JLqbeb1MvHqDTvP/uy/R1RsyVqDi6GCiHOI4G5p2Hpr3IA+/l/+Q== proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + forwarded "0.2.0" ipaddr.js "1.9.1" prr@~1.0.1: @@ -12841,7 +12728,7 @@ request-promise-core@1.1.4: dependencies: lodash "^4.17.19" -request-promise-native@^1.0.5, request-promise-native@^1.0.9: +request-promise-native@^1.0.5: version "1.0.9" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== @@ -12850,7 +12737,7 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.9: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.72.0, request@^2.88.0, request@^2.88.2: +request@^2.72.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -13371,6 +13258,7 @@ simple-swizzle@^0.2.2: "simplemde@https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost": version "1.11.2" + uid "4c39702de7d97f9b32d5c101f39237b6dab7c3ee" resolved "https://github.com/kevinansfield/simplemde-markdown-editor.git#4c39702de7d97f9b32d5c101f39237b6dab7c3ee" sinon@^9.0.0: @@ -13451,51 +13339,11 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socket.io-adapter@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" - integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== - socket.io-adapter@~2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz#a442720cb09a4823cfb81287dda1f9b52d4ccdb2" integrity sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw== -socket.io-client@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" - integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "~1.3.0" - debug "~3.1.0" - engine.io-client "~3.5.0" - has-binary2 "~1.0.2" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-parser@~3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" - integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== - dependencies: - component-emitter "~1.3.0" - debug "~3.1.0" - isarray "2.0.1" - -socket.io-parser@~3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" - integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== - dependencies: - component-emitter "1.2.1" - debug "~4.1.0" - isarray "2.0.1" - socket.io-parser@~4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" @@ -13505,18 +13353,6 @@ socket.io-parser@~4.0.3: component-emitter "~1.3.0" debug "~4.3.1" -socket.io@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" - integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== - dependencies: - debug "~4.1.0" - engine.io "~3.5.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.4.0" - socket.io-parser "~3.4.0" - socket.io@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.1.2.tgz#f90f9002a8d550efe2aa1d320deebb9a45b83233" @@ -13668,9 +13504,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.8" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.8.tgz#eb1e97ad99b11bf3f82a3b71a0472dd9a00f2ecf" - integrity sha512-NDgA96EnaLSvtbM7trJj+t1LUR3pirkDCcz9nOUlPb5DMBGsH7oES6C3hs3j7R9oHEa1EMvReS/BUAIT5Tcr0g== + version "3.0.9" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" + integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -13824,14 +13660,15 @@ string-width@^4.1.0, string-width@^4.2.0: strip-ansi "^6.0.0" string.prototype.matchall@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" - integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== + version "4.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" + integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has-symbols "^1.0.1" + es-abstract "^1.18.2" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" internal-slot "^1.0.3" regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" @@ -14127,7 +13964,7 @@ terser@^5.3.0: source-map "~0.7.2" source-map-support "~0.5.19" -testem@3.4.2: +testem@3.4.2, testem@^3.2.0: version "3.4.2" resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.2.tgz#0ee3ca4025a9085d47230b0c797c815882d4029e" integrity sha512-5undkzAltqE9fuLHy7c6Co/+pQWt0+03tsLpE97bx6ufymV9lJ1VkSO/tEfvQXk6XpLFcKTmbN/EM0RoK8FIOg== @@ -14162,41 +13999,6 @@ testem@3.4.2: tmp "0.0.33" xmldom "^0.6.0" -testem@^3.2.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.1.tgz#9b30c96001d08e590827a96fec1adb5df81792f8" - integrity sha512-UhKbTAb8JF6xRoDXd0AL0wl+Rpmio6KN7q+Xv7O9fcuioAqOQQVCNyxkYrJaihUPRKGr/r8ZKtSGe/Gdkm3uGQ== - dependencies: - backbone "^1.1.2" - bluebird "^3.4.6" - charm "^1.0.0" - commander "^2.6.0" - compression "^1.7.4" - consolidate "^0.15.1" - execa "^1.0.0" - express "^4.10.7" - fireworm "^0.7.0" - glob "^7.0.4" - http-proxy "^1.13.1" - js-yaml "^3.2.5" - lodash.assignin "^4.1.0" - lodash.castarray "^4.4.0" - lodash.clonedeep "^4.4.1" - lodash.find "^4.5.1" - lodash.uniqby "^4.7.0" - mkdirp "^0.5.1" - mustache "^3.0.0" - node-notifier "^9.0.1" - npmlog "^4.0.0" - printf "^0.6.1" - rimraf "^2.4.4" - socket.io "^2.1.0" - spawn-args "^0.2.0" - styled_string "0.0.1" - tap-parser "^7.0.0" - tmp "0.0.33" - xmldom "^0.6.0" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -14288,11 +14090,6 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -14391,9 +14188,9 @@ tr46@^1.0.1: punycode "^2.1.0" tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" @@ -14548,11 +14345,11 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.13.7" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.7.tgz#25468a3b39b1c875df03f0937b2b7036a93f3fee" - integrity sha512-1Psi2MmnZJbnEsgJJIlfnd7tFlJfitusmR7zDI8lXlFI0ACD4/Rm/xdrU8bh6zF0i74aiVoBtkRiFulkrmh3AA== + version "3.13.8" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.8.tgz#7c2f9f2553f611f3ff592bdc19c6fb208dc60afb" + integrity sha512-PvFLMFIQHfIjFFlvAch69U2IvIxK9TNzNWt1SxZGp9JZ/v70yvqIQuiJeVPPtUMOzoNt+aNRDk4wgxb34wvEqA== -unbox-primitive@^1.0.0: +unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== @@ -15166,10 +14963,10 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" -ws@^7.4.4, ws@~7.4.2: - version "7.4.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" - integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== +ws@^7.4.5, ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xdg-basedir@^4.0.0: version "4.0.0" @@ -15191,11 +14988,6 @@ xmldom@^0.6.0: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.6.0.tgz#43a96ecb8beece991cef382c08397d82d4d0c46f" integrity sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg== -xmlhttprequest-ssl@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" - integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== - xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -15223,8 +15015,3 @@ yam@^1.0.0: dependencies: fs-extra "^4.0.2" lodash.merge "^4.6.0" - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= From d9807a5bf8a7f138c3517fc887bfe8bcd36f3ea7 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 1 Jun 2021 10:46:28 +0100 Subject: [PATCH 0403/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20blank=20brandi?= =?UTF-8?q?ng=20preview=20on=20split=20front-end/admin=20domain=20setups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no issue - the POST request made to fetch the preview was going to the non-trailing-slash version of the site URL which was resulting in a redirect to the trailing-slash version which then failed due to CORS --- app/components/gh-brand-settings-form.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/components/gh-brand-settings-form.js b/app/components/gh-brand-settings-form.js index f24c98a84c..607ec36fda 100644 --- a/app/components/gh-brand-settings-form.js +++ b/app/components/gh-brand-settings-form.js @@ -142,7 +142,9 @@ export default class GhBrandSettingsFormComponent extends Component { 'x-ghost-preview': this.previewData } }; - const frontendUrl = this.config.get('blogUrl'); + + // TODO: config.blogUrl always removes trailing slash - switch to always have trailing slash + const frontendUrl = `${this.config.get('blogUrl')}/`; const previewContents = yield this.ajax.post(frontendUrl, ajaxOptions); // inject extra CSS to disable navigation and prevent clicks From 1a40dc6071a9cfba393afbf130a502f95c794fd3 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 1 Jun 2021 16:50:02 +0100 Subject: [PATCH 0404/3032] Fixed "this.args is undefined" error when pressing Escape to close roles modal no issue - the modal component is using a native class but with the `@classic` decorator so it's still using pre-Glimmer component syntax where `this.args` doesn't exist - fixes Sentry error `ADMIN-4C` --- app/components/modal-select-user-role.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/modal-select-user-role.js b/app/components/modal-select-user-role.js index 4ece7edfba..8f63a3c7ce 100644 --- a/app/components/modal-select-user-role.js +++ b/app/components/modal-select-user-role.js @@ -33,7 +33,7 @@ export default class ModalPostPreviewComponent extends ModalBase { // needed because ModalBase uses .send() for keyboard events closeModal() { - this.args.close(); + this.close(); } } } From 625581be736c7e8d932778cae9fe8903d6463109 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 1 Jun 2021 17:02:31 +0100 Subject: [PATCH 0405/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20`Enter`=20key?= =?UTF-8?q?=20not=20working=20in=20send=20email=20confirmation=20modal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no issue - the modal wasn't overriding the default `confirm` action so an error was thrown and the confirm action not triggered when pressing Enter whilst the modal is shown - resolves Sentry error `ADMIN-M` --- app/components/modal-confirm-email-send.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/components/modal-confirm-email-send.js b/app/components/modal-confirm-email-send.js index 60171f7474..6142775e4c 100644 --- a/app/components/modal-confirm-email-send.js +++ b/app/components/modal-confirm-email-send.js @@ -14,6 +14,18 @@ export default ModalComponent.extend({ // Allowed actions confirm: () => {}, + actions: { + confirm() { + if (this.errorMessage) { + return this.retryEmailTask.perform(); + } else { + if (!this.countPaidMembersTask.isRunning) { + return this.confirmAndCheckErrorTask.perform(); + } + } + } + }, + countPaidMembers: action(function () { // TODO: remove editor conditional once editors can query member counts if (['free', 'paid'].includes(this.model.sendEmailWhenPublished) && !this.session.get('user.isEditor')) { From 0a8834626153501a8a92b7148763753b28d8d625 Mon Sep 17 00:00:00 2001 From: Daniel Lockyer Date: Tue, 1 Jun 2021 17:11:51 +0100 Subject: [PATCH 0406/3032] Added CI step to trigger canary build refs https://github.com/TryGhost/Ghost/commit/84bfbae282f887a4b28fde206eb1d9b3390df0c8 - if Admin is pushed to after Ghost, the canary build won't contain Admin changes, so we need to trigger another canary build - this commit adds a final step to the CI flow that will trigger the Ghost canary build if all steps were successful --- .github/workflows/test.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3f8727d778..6fea5c6691 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,3 +72,16 @@ jobs: status: ${{ job.status }} env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + + canary: + runs-on: ubuntu-18.04 + needs: [lint, test, prod-build] + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + name: Canary + steps: + - name: Invoke Canary Build + uses: benc-uk/workflow-dispatch@v1 + with: + workflow: Canary Build + repo: TryGhost/Ghost + token: ${{ secrets.WORKFLOW_TOKEN }} From e30544f0781efd1311aba0d55623872a1629b65e Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 3 Jun 2021 13:22:07 +0100 Subject: [PATCH 0407/3032] =?UTF-8?q?=F0=9F=8E=A8=20Enabled=20use=20of=20G?= =?UTF-8?q?rammarly=20extension=20in=20the=20editor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no issue - Grammarly have indicated their extension is now compatible with the underlying editor technology used in Ghost - removed html attributes that explicitly disabled the extension on our editor fields --- lib/koenig-editor/addon/components/koenig-basic-html-input.hbs | 1 - lib/koenig-editor/addon/components/koenig-editor.hbs | 2 +- .../addon/components/koenig-text-replacement-html-input.hbs | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/koenig-editor/addon/components/koenig-basic-html-input.hbs b/lib/koenig-editor/addon/components/koenig-basic-html-input.hbs index 8e5dc2ce70..a81ccc7a10 100644 --- a/lib/koenig-editor/addon/components/koenig-basic-html-input.hbs +++ b/lib/koenig-editor/addon/components/koenig-basic-html-input.hbs @@ -1,7 +1,6 @@
    -
    +
    {{!-- pop-up markup toolbar is shown when there's a selection --}} diff --git a/lib/koenig-editor/addon/components/koenig-text-replacement-html-input.hbs b/lib/koenig-editor/addon/components/koenig-text-replacement-html-input.hbs index 326a854497..b99fa7547d 100644 --- a/lib/koenig-editor/addon/components/koenig-text-replacement-html-input.hbs +++ b/lib/koenig-editor/addon/components/koenig-text-replacement-html-input.hbs @@ -1,7 +1,6 @@
    Date: Thu, 3 Jun 2021 13:59:47 +0100 Subject: [PATCH 0408/3032] Update dependency @tryghost/kg-clean-basic-html to v1.0.18 (#1987) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0fd317eb03..5632f49aa9 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@html-next/vertical-collection": "2.0.0", "@sentry/ember": "6.5.0", "@tryghost/helpers": "1.1.45", - "@tryghost/kg-clean-basic-html": "1.0.17", + "@tryghost/kg-clean-basic-html": "1.0.18", "@tryghost/kg-parser-plugins": "1.1.7", "@tryghost/limit-service": "0.6.0", "@tryghost/members-csv": "1.0.0", diff --git a/yarn.lock b/yarn.lock index 64803d4bc9..bd79102806 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1795,7 +1795,12 @@ dependencies: lodash-es "^4.17.11" -"@tryghost/kg-clean-basic-html@1.0.17", "@tryghost/kg-clean-basic-html@^1.0.17": +"@tryghost/kg-clean-basic-html@1.0.18": + version "1.0.18" + resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.18.tgz#2d626c5da951551cf09c28a55ac23df801d2e880" + integrity sha512-5jUY/McF01hDi6BsdKOsBhtdhmuCv1djYYj7eVOFGFcdmLkxRHOJWqmRfJTCVdfeU5hnOu+D6XcNsDxmTJXLKQ== + +"@tryghost/kg-clean-basic-html@^1.0.17": version "1.0.17" resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.17.tgz#5b60ca9d020fc9cb02e938caec0ec1da969a73de" integrity sha512-lvqXs51YdokNQg1bwuk/a3C+0h6Ve6Fw23hUJvBKl6ViaKae6KcLHX3qyVr7uN/QpKMWrhsAD0pdoo+2xA0FWQ== From 9003b2edf52a0c1e57e49e5396ac61867e9d3b4a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 14:00:19 +0100 Subject: [PATCH 0409/3032] Update dependency ember-concurrency to v2.1.0 (#1989) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5632f49aa9..c5fa51d023 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "ember-cli-terser": "4.0.2", "ember-cli-test-loader": "3.0.0", "ember-composable-helpers": "4.4.1", - "ember-concurrency": "2.0.3", + "ember-concurrency": "2.1.0", "ember-concurrency-decorators": "2.0.3", "ember-data": "3.21.2", "ember-decorators": "6.1.1", diff --git a/yarn.lock b/yarn.lock index bd79102806..f84ead7190 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6451,7 +6451,18 @@ ember-concurrency-decorators@2.0.3, ember-concurrency-decorators@^2.0.0: ember-cli-htmlbars "^4.3.1" ember-cli-typescript "^3.1.4" -ember-concurrency@2.0.3, "ember-concurrency@>=1.0.0 <3", "ember-concurrency@^0.8.27 || ^0.9.0 || ^0.10.0 || ^1.0.0 || ^2.0.0-rc.1": +ember-concurrency@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-2.1.0.tgz#5e55c19f43fb245c4fbe0628cbf26cc6561af40c" + integrity sha512-NIJfphS9NvO3Fin+QPQkTvhD8rFDc9ydpy+my+VFLcCfC5F+yI6sr5tHVSgSVBh8UutloHvIbGvdfKuoY6Abyg== + dependencies: + "@glimmer/tracking" "^1.0.2" + ember-cli-babel "^7.22.1" + ember-cli-htmlbars "^5.6.3" + ember-compatibility-helpers "^1.2.0" + ember-destroyable-polyfill "^2.0.2" + +"ember-concurrency@>=1.0.0 <3", "ember-concurrency@^0.8.27 || ^0.9.0 || ^0.10.0 || ^1.0.0 || ^2.0.0-rc.1": version "2.0.3" resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-2.0.3.tgz#d8ac917fdf013a277bfc7b26e417937ee0638455" integrity sha512-+fOOFt32odnunDL3Du0LqMgnRzDDNKnzo1ry9ppICpvLXekJzYFwU1RniVivfJ+9nbpHMJZQUlZJAm1ZAnTExw== From fdea0f4163d9af92ff28c4efe49913aef5e5d4cc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 14:00:48 +0100 Subject: [PATCH 0410/3032] Update dependency @sentry/ember to v6.5.1 (#1991) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 106 +++++++++++++++++++++++++-------------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index c5fa51d023..80974a0e8b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@ember/render-modifiers": "1.0.2", "@glimmer/component": "1.0.4", "@html-next/vertical-collection": "2.0.0", - "@sentry/ember": "6.5.0", + "@sentry/ember": "6.5.1", "@tryghost/helpers": "1.1.45", "@tryghost/kg-clean-basic-html": "1.0.18", "@tryghost/kg-parser-plugins": "1.1.7", diff --git a/yarn.lock b/yarn.lock index f84ead7190..a5223b1592 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1667,82 +1667,82 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" -"@sentry/browser@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.5.0.tgz#2382493691c3fac5d8b652ae46f09f1b29d288ef" - integrity sha512-n1e8hNKwuVP4bLqRK5J0DHFqnnnrbv6h6+Bc1eNRbf32/e6eZ3Cb36PTplqDCxwnMnnIEEowd5F4ZWeTLPPY3A== - dependencies: - "@sentry/core" "6.5.0" - "@sentry/types" "6.5.0" - "@sentry/utils" "6.5.0" +"@sentry/browser@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.5.1.tgz#9a6ed5607b3b0f4e83f38720e3e202906f8c5bdb" + integrity sha512-iVLCdEFwsoWAzE/hNknexPQjjDpMQV7mmaq9Z1P63bD6MfhwVTx4hG4pHn8HEvC38VvCVf1wv0v/LxtoODAYXg== + dependencies: + "@sentry/core" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" tslib "^1.9.3" -"@sentry/core@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.5.0.tgz#03ecbad7845b31f03a84eddf4884877c999bb6be" - integrity sha512-Hx/WvhM5bXcXqfIiz+505TjYYfPjQ8mrxby/EWl+L7dYUCyI/W6IZKTc/MoHlLuM+JPUW9c1bw/97TzbgTzaAA== +"@sentry/core@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.5.1.tgz#c8b6c3ed86ed07b193c95d599c1b9a4a161e500e" + integrity sha512-Mh3sl/iUOT1myHmM6RlDy2ARzkUClx/g4DAt1rJ/IpQBOlDYQraplXSIW80i/hzRgQDfwhwgf4wUa5DicKBjKw== dependencies: - "@sentry/hub" "6.5.0" - "@sentry/minimal" "6.5.0" - "@sentry/types" "6.5.0" - "@sentry/utils" "6.5.0" + "@sentry/hub" "6.5.1" + "@sentry/minimal" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" tslib "^1.9.3" -"@sentry/ember@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@sentry/ember/-/ember-6.5.0.tgz#ccdab6c344557139ce492211c56a7b374ad64860" - integrity sha512-8Q8f7UeP1GWdGZmNnl8wSOrZy7psLYrCbHwlZRHQUYla2ZwiqRM/GEOkfeJQ085o7QDDAKUfzjGaWdLmJ2vdYA== +"@sentry/ember@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/ember/-/ember-6.5.1.tgz#14e509ef423b96042d4a4d369ee0372b021933c1" + integrity sha512-Cz2aphicp4OQY6lSrcre9LN7rQQvmFc2z4FuWiH6zjUk2C2t/JjGs25WQQx4lT6ZFwmAhM2zTaYf12vU3+IefA== dependencies: "@embroider/macros" "~0.37.0" - "@sentry/browser" "6.5.0" - "@sentry/tracing" "6.5.0" - "@sentry/types" "6.5.0" - "@sentry/utils" "6.5.0" + "@sentry/browser" "6.5.1" + "@sentry/tracing" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" ember-auto-import "^1.6.0" ember-cli-babel "^7.20.5" ember-cli-htmlbars "^5.1.2" ember-cli-typescript "^3.1.4" -"@sentry/hub@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.5.0.tgz#ad3c9bcf83050ea217f3c25cc625e6b447f1d9d7" - integrity sha512-vEChnLoozOJzEJoTUvaAsK/n7IHoQFx8P1TzQmnR+8XGZJZmGHG6bBXUH0iS2a9hhR1WkoEBeiL+t96R9uyf0A== +"@sentry/hub@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.5.1.tgz#135ef09d07d32e87a53f664c0ae8fcc4f5963519" + integrity sha512-lBRMBVMYP8B4PfRiM70murbtJAXiIAao/asDEMIRNGMP6pI2ArqXfJCBYDkStukhikYD0Kqb4trXq+JYF07Hbg== dependencies: - "@sentry/types" "6.5.0" - "@sentry/utils" "6.5.0" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" tslib "^1.9.3" -"@sentry/minimal@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.5.0.tgz#aa89b8e24c88aa85c99ef64e0b460497c90133f9" - integrity sha512-MT83ONaBhTCFUlDIQFpsG/lq3ZjGK7jwQ10qxGadSg1KW6EvtQRg+OBwULeQ7C+nNEAhseNrC/qomZMT8brncg== +"@sentry/minimal@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.5.1.tgz#b8c1b382c2ea788eec3d32d203e5081b00eb6838" + integrity sha512-q9Do/oreu1RP695CXCLowVDuQyk7ilE6FGdz2QLpTXAfx8247qOwk6+zy9Kea/Djk93+BoSDVQUSneNiVwl0nQ== dependencies: - "@sentry/hub" "6.5.0" - "@sentry/types" "6.5.0" + "@sentry/hub" "6.5.1" + "@sentry/types" "6.5.1" tslib "^1.9.3" -"@sentry/tracing@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.5.0.tgz#4d8efce53362a820d002838495f0ef446150aefc" - integrity sha512-6jpmYM3Lt4w6dOeK8keGAis722ooLtX5UcPbekkTufXiqKRR5VWg8DLUp7z7oD6h4GLrLbeNtCiH6h20ZW2ggw== +"@sentry/tracing@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.5.1.tgz#a5f3e497d4f1f319f36475df050e135cf65af750" + integrity sha512-y1W/xFC2hAuKqSuuaovkElHY4pbli3XoXrreesg8PtO7ilX6ZbatOQbHsEsHQyoUv0F6aVA+MABOxWH2jt7tfw== dependencies: - "@sentry/hub" "6.5.0" - "@sentry/minimal" "6.5.0" - "@sentry/types" "6.5.0" - "@sentry/utils" "6.5.0" + "@sentry/hub" "6.5.1" + "@sentry/minimal" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" tslib "^1.9.3" -"@sentry/types@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.5.0.tgz#2cdb50875bb73d87708b9c0a80d4ca057b3596b5" - integrity sha512-yQpTCIYxBsYT0GenqHNNKeXV8CSkkYlAxB1IGV2eac4IKC5ph5GW6TfDGwvlzQSQ297RsRmOSA8o3I5gGPd2yA== +"@sentry/types@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.5.1.tgz#0a34ecfd1ae9275a416a105640eb4bed45a46a1d" + integrity sha512-b/7a6CMoytaeFPx4IBjfxPw3nPvsQh7ui1C8Vw0LxNNDgBwVhPLzUOWeLWbo5YZCVbGEMIWwtCUQYWxneceZSA== -"@sentry/utils@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.5.0.tgz#8722542b9a901623195cffaab5d18ce176c1e459" - integrity sha512-CcHuaQN6vRuAsIC+3sA23NmWLRmUN0x/HNQxk0DHJylvYQdEA0AUNoLXogykaXh6NrCx4DNq9yCQTNTSC3mFxg== +"@sentry/utils@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.5.1.tgz#046baf7d1a6564d6d555437ad3674dba9bc0806a" + integrity sha512-Wv86JYGQH+ZJ5XGFQX7h6ijl32667ikenoL9EyXMn8UoOYX/MLwZoQZin1P60wmKkYR9ifTNVmpaI9OoTaH+UQ== dependencies: - "@sentry/types" "6.5.0" + "@sentry/types" "6.5.1" tslib "^1.9.3" "@simple-dom/interface@^1.4.0": From 09c6f88f02a9c21d045f1d4f73bf46951fc9ced5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 14:01:02 +0100 Subject: [PATCH 0411/3032] Update dependency ember-fetch to v8.0.5 (#1992) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 80974a0e8b..4d5b334b1b 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "ember-ella-sparse": "0.16.0", "ember-exam": "6.0.1", "ember-export-application-global": "2.0.1", - "ember-fetch": "8.0.4", + "ember-fetch": "8.0.5", "ember-in-viewport": "3.9.0", "ember-infinity": "2.2.0", "ember-keyboard": "6.0.3", diff --git a/yarn.lock b/yarn.lock index a5223b1592..c043c3f00c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2178,7 +2178,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abortcontroller-polyfill@^1.4.0: +abortcontroller-polyfill@^1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q== @@ -3616,7 +3616,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@4.2.5, broccoli-concat@^4.2.4: +broccoli-concat@4.2.5, broccoli-concat@^4.2.4, broccoli-concat@^4.2.5: version "4.2.5" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-4.2.5.tgz#d578f00094048b5fc87195e82fbdbde20d838d29" integrity sha512-dFB5ATPwOyV8S2I7a07HxCoutoq23oY//LhM6Mou86cWUTB174rND5aQLR7Fu8FjFFLxoTbkk7y0VPITJ1IQrw== @@ -6587,13 +6587,13 @@ ember-factory-for-polyfill@^1.3.1: dependencies: ember-cli-version-checker "^2.1.0" -ember-fetch@8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-8.0.4.tgz#b9a3239e9d188ada18a4448ccb4fea2a091e3952" - integrity sha512-vx/v6+OTZMDbm6BT5TI6Q/NSuaWPbQxb2KRDD4yR/iJoRl2DtfgXiCA491pYT5IwAAtp6NbMa1CitIQDoaII9Q== +ember-fetch@8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-8.0.5.tgz#0ed6257b3158473f662e72831cab223010c5ec50" + integrity sha512-tKwSWZ2l4jKynqUuF8qgwiCfzmnRWDDO2j5l0Lrn4TgZo8YXbdM3DfgheLSZd+aybBFEAtXBgKH0qaTox28LFg== dependencies: - abortcontroller-polyfill "^1.4.0" - broccoli-concat "^4.2.4" + abortcontroller-polyfill "^1.7.1" + broccoli-concat "^4.2.5" broccoli-debug "^0.6.5" broccoli-merge-trees "^4.2.0" broccoli-rollup "^2.1.1" @@ -6601,10 +6601,11 @@ ember-fetch@8.0.4: broccoli-templater "^2.0.1" calculate-cache-key-for-tree "^2.0.0" caniuse-api "^3.0.0" - ember-cli-babel "^7.23.0" + ember-cli-babel "^7.23.1" ember-cli-typescript "^3.1.3" + ember-cli-version-checker "^5.1.2" node-fetch "^2.6.1" - whatwg-fetch "^3.4.0" + whatwg-fetch "^3.6.2" ember-get-config@, "ember-get-config@^0.2.4 || ^0.3.0": version "0.3.0" @@ -14837,7 +14838,7 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@^3.4.0: +whatwg-fetch@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== From 64315b706a69885865b6c6219cde3bc5dcf10623 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 14:52:03 +0100 Subject: [PATCH 0412/3032] Update dependency @tryghost/kg-parser-plugins to v1.1.8 (#1988) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 4d5b334b1b..2d2c5d2f34 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@sentry/ember": "6.5.1", "@tryghost/helpers": "1.1.45", "@tryghost/kg-clean-basic-html": "1.0.18", - "@tryghost/kg-parser-plugins": "1.1.7", + "@tryghost/kg-parser-plugins": "1.1.8", "@tryghost/limit-service": "0.6.0", "@tryghost/members-csv": "1.0.0", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", diff --git a/yarn.lock b/yarn.lock index c043c3f00c..5a34cc5381 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1795,22 +1795,17 @@ dependencies: lodash-es "^4.17.11" -"@tryghost/kg-clean-basic-html@1.0.18": +"@tryghost/kg-clean-basic-html@1.0.18", "@tryghost/kg-clean-basic-html@^1.0.18": version "1.0.18" resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.18.tgz#2d626c5da951551cf09c28a55ac23df801d2e880" integrity sha512-5jUY/McF01hDi6BsdKOsBhtdhmuCv1djYYj7eVOFGFcdmLkxRHOJWqmRfJTCVdfeU5hnOu+D6XcNsDxmTJXLKQ== -"@tryghost/kg-clean-basic-html@^1.0.17": - version "1.0.17" - resolved "https://registry.yarnpkg.com/@tryghost/kg-clean-basic-html/-/kg-clean-basic-html-1.0.17.tgz#5b60ca9d020fc9cb02e938caec0ec1da969a73de" - integrity sha512-lvqXs51YdokNQg1bwuk/a3C+0h6Ve6Fw23hUJvBKl6ViaKae6KcLHX3qyVr7uN/QpKMWrhsAD0pdoo+2xA0FWQ== - -"@tryghost/kg-parser-plugins@1.1.7": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@tryghost/kg-parser-plugins/-/kg-parser-plugins-1.1.7.tgz#b6fd853a9b9cf6dd094466cd685d03b5779a278b" - integrity sha512-ahDsM8V+IvU/7GEZEEsLntItdXLd0qHkn/TfdhKxE/oHbrON3VvJ/ue9WUUFGtysSx6m/rdWzYeGZ+K2nOsJnw== +"@tryghost/kg-parser-plugins@1.1.8": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@tryghost/kg-parser-plugins/-/kg-parser-plugins-1.1.8.tgz#ce722ed3f8376c8f38d88f0c40ed5d9c04203f7b" + integrity sha512-VCIahwP0F0U3l/9lVHcW86PPWLuGW7g3TuxAN9NV8crkJZVxVwNEfYTn7bDiRIELYgQIG7jrH6jMlbm6q6ZueA== dependencies: - "@tryghost/kg-clean-basic-html" "^1.0.17" + "@tryghost/kg-clean-basic-html" "^1.0.18" "@tryghost/limit-service@0.6.0": version "0.6.0" From cfd4fc022e6947d86198c849695d842523151600 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Thu, 3 Jun 2021 15:26:26 +0100 Subject: [PATCH 0413/3032] Update dependencies ember-in-viewport@3.9.0 and ember-infinity@2.2.1 no issue - dependencies needed to be updated together due to inter-dependency version issues --- package.json | 4 ++-- yarn.lock | 58 +++++++++++++++------------------------------------- 2 files changed, 19 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 2d2c5d2f34..08f50a938b 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,8 @@ "ember-exam": "6.0.1", "ember-export-application-global": "2.0.1", "ember-fetch": "8.0.5", - "ember-in-viewport": "3.9.0", - "ember-infinity": "2.2.0", + "ember-in-viewport": "3.10.2", + "ember-infinity": "2.2.1", "ember-keyboard": "6.0.3", "ember-load": "0.0.17", "ember-load-initializers": "2.1.2", diff --git a/yarn.lock b/yarn.lock index 5a34cc5381..5c0831157b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5768,7 +5768,7 @@ ember-assign-polyfill@^2.6.0: ember-cli-babel "^7.20.5" ember-cli-version-checker "^2.0.0" -ember-auto-import@1.11.3, ember-auto-import@^1.2.19, ember-auto-import@^1.5.2, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: +ember-auto-import@1.11.3, ember-auto-import@^1.11.2, ember-auto-import@^1.2.19, ember-auto-import@^1.5.3, ember-auto-import@^1.6.0: version "1.11.3" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.3.tgz#6e3384a7fbb163384a34546f2e902cd297b0e683" integrity sha512-ekq/XCvsonESobFU30zjZ0I4XMy2E/2ZILCYWuQ1JdhcCSTYhnXDZcqRW8itUG7kbsPqAHT/XZ1LEZYm3seVwQ== @@ -6628,39 +6628,27 @@ ember-in-element-polyfill@^1.0.1: ember-cli-htmlbars "^5.3.1" ember-cli-version-checker "^5.1.2" -ember-in-viewport@3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ember-in-viewport/-/ember-in-viewport-3.9.0.tgz#2d1eea2e7ea058f8816f1e7a9b5bcc86e632f6fe" - integrity sha512-OhHKqJKseF1S3NefCRe0jeaGEVOmXqinrlYpi7jfjhsjwHCt8MUAhBZiWycwOmbYwVBPRwpFlDrLNmN1uJxAYA== +ember-in-viewport@3.10.2, ember-in-viewport@~3.10.2: + version "3.10.2" + resolved "https://registry.yarnpkg.com/ember-in-viewport/-/ember-in-viewport-3.10.2.tgz#78ad3d42ba94354fd05e7adb7a701da351041556" + integrity sha512-mOLqknUm+OjPqyYq9BO+h9RIcI3dhebPpfd8jM90/GXVv7jLNz1szq5nk0K0yZT861kY+dEjGLqLGqo1J4pSDQ== dependencies: - ember-auto-import "^1.6.0" - ember-cli-babel "^7.22.1" + ember-auto-import "^1.11.2" + ember-cli-babel "^7.26.3" ember-modifier "^2.1.0" fast-deep-equal "^2.0.1" - intersection-observer-admin "~0.2.13" - raf-pool "~0.1.4" - -ember-in-viewport@~3.7.2: - version "3.7.8" - resolved "https://registry.yarnpkg.com/ember-in-viewport/-/ember-in-viewport-3.7.8.tgz#0542cb4dad7763bd93ee6a5c660f39b2d28ea1d5" - integrity sha512-XEQ4q+ca3SaREL72Eb7XQRGrmNTjOS52ZUj7KvKLpywoyYKTpAfFoSHZMpyk15X9D7dtAihayTpEgeVoHaLa3Q== - dependencies: - ember-auto-import "^1.5.2" - ember-cli-babel "^7.7.3" - ember-modifier "^1.0.2" - fast-deep-equal "^2.0.1" - intersection-observer-admin "~0.2.12" + intersection-observer-admin "~0.3.2" raf-pool "~0.1.4" -ember-infinity@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-infinity/-/ember-infinity-2.2.0.tgz#e2ef5724e7b7d33ae3a311be16ed3cc7ced3826a" - integrity sha512-pkaWUfLBAFztiyTK+xfDBEw3l6n403v0ArA3x0BEMLHmMv/y879X5rX9/RPDif1SrT+itcsnKBbV9tagVTfv7w== +ember-infinity@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ember-infinity/-/ember-infinity-2.2.1.tgz#2f1b170af4449c17b855af075f3c3d2d7e68d915" + integrity sha512-TXzUGclu7tG7wO0jhtFyzsOuCJBBy9457m15hZQZTJWl+CarGx04C43kob7oAqsp21nBrXfi2+C2Ttt2PH21iw== dependencies: "@ember/render-modifiers" "^1.0.2" ember-cli-babel "~7.19.0" ember-cli-htmlbars "^4.3.1" - ember-in-viewport "~3.7.2" + ember-in-viewport "~3.10.2" "ember-inflector@^2.0.0 || ^3.0.0 || ^4.0.0": version "4.0.1" @@ -6767,18 +6755,6 @@ ember-modifier@2.1.2, ember-modifier@^2.1.0, ember-modifier@^2.1.1: ember-destroyable-polyfill "^2.0.2" ember-modifier-manager-polyfill "^1.2.0" -ember-modifier@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-1.0.5.tgz#b0152a4b81b72debbff48ff75f0ff0959afa1df2" - integrity sha512-bOqWyp6bEa8i/2c2Gay6b9CVB7CAROg2UuX+C3eDMOdGUEzrsBZ5ENul5zF4RHey2RuAqZ/qvQpY/85R2fQ94A== - dependencies: - ember-cli-babel "^7.11.1" - ember-cli-is-package-missing "^1.0.0" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-compatibility-helpers "^1.2.1" - ember-modifier-manager-polyfill "^1.2.0" - ember-moment@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-8.0.1.tgz#3a11929efeb7fb6bc5c1cc2c9e4c43bd9c500f80" @@ -9246,10 +9222,10 @@ interpret@~1.1.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= -intersection-observer-admin@~0.2.12, intersection-observer-admin@~0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/intersection-observer-admin/-/intersection-observer-admin-0.2.13.tgz#00a021695bf5aef8d198204514d2f849fd27d089" - integrity sha512-REIM59IHXPe9U5eTnowurzzfhgqVkSImZJnOSJZTAJ0LnyJqw8S/eD5s8ZYneQfm9JszhGIBwudF9gF02A3BpQ== +intersection-observer-admin@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/intersection-observer-admin/-/intersection-observer-admin-0.3.2.tgz#0b6e95ce7272a383e8bbdd47f9ff48de9eab9919" + integrity sha512-kJEcF9iVRuI4thXiJd28UzFDgvFHBNUgwkKA4F0bPMmRdzc+1Eq7/J13n2gSgfZ5tsVxb+wJOV7k3DXcsc7D6Q== into-stream@^3.1.0: version "3.1.0" From ba7b19cfe0739cf00d282e5e5d954803596b784b Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 3 Jun 2021 18:02:32 +0200 Subject: [PATCH 0414/3032] Added product selector modal for complimentary sub Developer experiment for multiple products. - Added modal to choose a product for complimentary subscriptions. --- app/components/gh-member-settings-form-cp.hbs | 14 ++- app/components/modal-member-product.hbs | 85 +++++++++++-------- app/styles/patterns/forms.css | 56 ++++++++++++ 3 files changed, 117 insertions(+), 38 deletions(-) diff --git a/app/components/gh-member-settings-form-cp.hbs b/app/components/gh-member-settings-form-cp.hbs index bf8a341069..2927e0a715 100644 --- a/app/components/gh-member-settings-form-cp.hbs +++ b/app/components/gh-member-settings-form-cp.hbs @@ -116,9 +116,17 @@ {{#if this.isCreatingComplimentary}} {{else}} - + {{#if (enable-developer-experiments)}} + {{!-- {{if has multiple products!}} --}} + + {{!-- {{/if}} --}} + {{else}} + + {{/if}} {{/if}} {{/if}} {{/unless}} diff --git a/app/components/modal-member-product.hbs b/app/components/modal-member-product.hbs index 699e46df6b..7f0c4c8b3d 100644 --- a/app/components/modal-member-product.hbs +++ b/app/components/modal-member-product.hbs @@ -1,38 +1,44 @@ - + +{{svg-jar "close"}}
    @@ -197,12 +197,4 @@
    {{/unless}} -
    - -{{#if this.showEmailDesignSettings}} - - - -{{/if}} \ No newline at end of file +
    \ No newline at end of file diff --git a/app/controllers/settings/members-email.js b/app/controllers/settings/members-email.js index 54ff546c64..b8ac5f0797 100644 --- a/app/controllers/settings/members-email.js +++ b/app/controllers/settings/members-email.js @@ -9,13 +9,14 @@ export default class MembersEmailController extends Controller { @service session; @service settings; - queryParams = ['emailRecipientsOpen'] + queryParams = ['emailRecipientsOpen', 'showEmailDesignSettings'] // from/supportAddress are set here so that they can be reset to saved values on save // to avoid it looking like they've been saved when they have a separate update process @tracked fromAddress = ''; @tracked supportAddress = ''; + @tracked showEmailDesignSettings = false; @tracked emailRecipientsOpen = false; @tracked showLeaveSettingsModal = false; @@ -24,6 +25,11 @@ export default class MembersEmailController extends Controller { this[property] = email; } + @action + toggleEmailDesignSettings() { + this.showEmailDesignSettings = !this.showEmailDesignSettings; + } + @action toggleEmailRecipientsOpen() { this.emailRecipientsOpen = !this.emailRecipientsOpen; @@ -35,6 +41,7 @@ export default class MembersEmailController extends Controller { this.leaveSettingsTransition = transition; this.showLeaveSettingsModal = true; } + this.showEmailDesignSettings = false; } @action diff --git a/app/templates/settings/members-email.hbs b/app/templates/settings/members-email.hbs index 7a112f3818..4fae94dae1 100644 --- a/app/templates/settings/members-email.hbs +++ b/app/templates/settings/members-email.hbs @@ -25,6 +25,7 @@ @supportAddress={{this.supportAddress}} @setEmailAddress={{this.setEmailAddress}} @emailRecipientsExpanded={{this.emailRecipientsOpen}} + @toggleEmailDesignSettings={{this.toggleEmailDesignSettings}} @toggleEmailRecipientsExpansion={{this.toggleEmailRecipientsOpen}} />
    @@ -40,4 +41,12 @@ @modifier="action wide" /> {{/if}} - \ No newline at end of file + + +{{#if this.showEmailDesignSettings}} + + + +{{/if}} \ No newline at end of file From d86ecde13bdcd867387b635b0237ea6591ddea34 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 13:07:47 +0530 Subject: [PATCH 0416/3032] Added UI for handling multiple tiers in membership settings refs https://github.com/TryGhost/Team/issues/715 Adds new modal and component to handle managing a list of products(tiers) in Admin behind the developer experiments flag. Also adds a new helper for stripe prices to convert amount from decimal value. --- .../gh-membership-products-alpha.hbs | 54 ++++++ .../gh-membership-products-alpha.js | 41 +++++ app/components/modal-product.hbs | 106 ++++++++++++ app/components/modal-product.js | 161 ++++++++++++++++++ app/helpers/gh-price-amount.js | 13 ++ app/styles/layouts/products.css | 6 +- app/templates/settings/membership.hbs | 103 +++++------ 7 files changed, 434 insertions(+), 50 deletions(-) create mode 100644 app/components/gh-membership-products-alpha.hbs create mode 100644 app/components/gh-membership-products-alpha.js create mode 100644 app/components/modal-product.hbs create mode 100644 app/components/modal-product.js create mode 100644 app/helpers/gh-price-amount.js diff --git a/app/components/gh-membership-products-alpha.hbs b/app/components/gh-membership-products-alpha.hbs new file mode 100644 index 0000000000..70a6c9e103 --- /dev/null +++ b/app/components/gh-membership-products-alpha.hbs @@ -0,0 +1,54 @@ +{{#each this.products as |product|}} +
    +
    +
    +

    + {{product.name}} +

    +

    + {{product.description}} +

    +
    +
    +
    +

    + Pricing +

    +

    + {{product.monthlyPrice.currency}} + {{gh-price-amount product.monthlyPrice.amount}}/month +

    +

    + {{product.monthlyPrice.currency}} + {{gh-price-amount product.yearlyPrice.amount}}/year +

    +
    +
    +
    +
    +
    + +
    +
    +
    +{{/each}} +
    +
    +

    + + New tier +

    +
    +
    + +{{#if this.showProductModal}} + +{{/if}} diff --git a/app/components/gh-membership-products-alpha.js b/app/components/gh-membership-products-alpha.js new file mode 100644 index 0000000000..f95a6d9c54 --- /dev/null +++ b/app/components/gh-membership-products-alpha.js @@ -0,0 +1,41 @@ +import Component from '@glimmer/component'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {tracked} from '@glimmer/tracking'; + +export default class extends Component { + @service membersUtils; + @service ghostPaths; + @service ajax; + @service store; + @service config; + + @tracked showProductModal = false; + @tracked productModel = null; + + get products() { + return this.args.products; + } + + @action + async openEditProduct(product) { + this.productModel = product; + this.showProductModal = true; + } + + @action + async openNewProduct() { + this.productModel = this.store.createRecord('product'); + this.showProductModal = true; + } + + @action + closeProductModal() { + this.showProductModal = false; + } + + @action + confirmProductSave() { + this.args.confirmProductSave(); + } +} diff --git a/app/components/modal-product.hbs b/app/components/modal-product.hbs new file mode 100644 index 0000000000..e7fce91ee6 --- /dev/null +++ b/app/components/modal-product.hbs @@ -0,0 +1,106 @@ + + + + + + + + \ No newline at end of file diff --git a/app/components/modal-product.js b/app/components/modal-product.js new file mode 100644 index 0000000000..22370712e1 --- /dev/null +++ b/app/components/modal-product.js @@ -0,0 +1,161 @@ +import EmberObject, {action} from '@ember/object'; +import ModalBase from 'ghost-admin/components/modal-base'; +import classic from 'ember-classic-decorator'; +import {currencies, getCurrencyOptions, getSymbol} from 'ghost-admin/utils/currency'; +import {isEmpty} from '@ember/utils'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; + +const CURRENCIES = currencies.map((currency) => { + return { + value: currency.isoCode.toLowerCase(), + label: `${currency.isoCode} - ${currency.name}`, + isoCode: currency.isoCode + }; +}); + +// TODO: update modals to work fully with Glimmer components +@classic +export default class ModalProductPrice extends ModalBase { + @service settings; + @tracked model; + @tracked product; + @tracked periodVal; + @tracked stripeMonthlyAmount = 5; + @tracked stripeYearlyAmount = 50; + @tracked currency = 'usd'; + @tracked errors = EmberObject.create(); + @tracked stripePlanError = ''; + + confirm() {} + + get allCurrencies() { + return getCurrencyOptions(); + } + + get selectedCurrency() { + return CURRENCIES.findBy('value', this.currency); + } + + init() { + super.init(...arguments); + this.product = this.model.product; + const monthlyPrice = this.product.get('monthlyPrice'); + const yearlyPrice = this.product.get('yearlyPrice'); + if (monthlyPrice) { + this.stripeMonthlyAmount = (monthlyPrice.amount / 100); + this.currency = monthlyPrice.currency; + } + if (yearlyPrice) { + this.stripeYearlyAmount = (yearlyPrice.amount / 100); + } + } + + get title() { + if (this.isExistingProduct) { + return `Product - ${this.product.name || 'No Name'}`; + } + return 'New Product'; + } + + get isExistingProduct() { + return !!this.model.product; + } + + // TODO: rename to confirm() when modals have full Glimmer support + @action + confirmAction() { + this.saveProduct.perform(); + } + + @action + close(event) { + event?.preventDefault?.(); + this.closeModal(); + } + @action + setCurrency(event) { + const newCurrency = event.value; + this.currency = newCurrency; + } + + @task({drop: true}) + *saveProduct() { + this.validatePrices(); + if (!isEmpty(this.errors) && Object.keys(this.errors).length > 0) { + return; + } + if (this.stripePlanError) { + return; + } + const monthlyAmount = this.stripeMonthlyAmount * 100; + const yearlyAmount = this.stripeYearlyAmount * 100; + this.product.set('monthlyPrice', { + nickname: 'Monthly', + amount: monthlyAmount, + active: true, + currency: this.currency, + interval: 'month', + type: 'recurring' + }); + this.product.set('yearlyPrice', { + nickname: 'Yearly', + amount: yearlyAmount, + active: true, + currency: this.currency, + interval: 'year', + type: 'recurring' + }); + const savedProduct = yield this.product.save(); + yield this.confirm(savedProduct); + this.send('closeModal'); + } + + validatePrices() { + this.stripePlanError = undefined; + + try { + const yearlyAmount = this.stripeYearlyAmount; + const monthlyAmount = this.stripeMonthlyAmount; + const symbol = getSymbol(this.currency); + if (!yearlyAmount || yearlyAmount < 1 || !monthlyAmount || monthlyAmount < 1) { + throw new TypeError(`Subscription amount must be at least ${symbol}1.00`); + } + } catch (err) { + this.stripePlanError = err.message; + } + } + + actions = { + confirm() { + this.confirmAction(...arguments); + }, + setAmount(amount) { + this.price.amount = !isNaN(amount) ? parseInt(amount) : 0; + }, + + setCurrency(event) { + const newCurrency = event.value; + this.currency = newCurrency; + }, + validateStripePlans() { + this.stripePlanError = undefined; + + try { + const yearlyAmount = this.stripeYearlyAmount; + const monthlyAmount = this.stripeMonthlyAmount; + const symbol = getSymbol(this.currency); + if (!yearlyAmount || yearlyAmount < 1 || !monthlyAmount || monthlyAmount < 1) { + throw new TypeError(`Subscription amount must be at least ${symbol}1.00`); + } + } catch (err) { + this.stripePlanError = err.message; + } + }, + // needed because ModalBase uses .send() for keyboard events + closeModal() { + this.close(); + } + } +} diff --git a/app/helpers/gh-price-amount.js b/app/helpers/gh-price-amount.js new file mode 100644 index 0000000000..6bb0beb5db --- /dev/null +++ b/app/helpers/gh-price-amount.js @@ -0,0 +1,13 @@ +import {helper} from '@ember/component/helper'; + +export function ghPriceAmount(amount) { + if (amount) { + return Math.round(amount / 100); + } + return 0; +} + +// like {{pluralize}} but formats the number according to current locale +export default helper(function ([amount]) { + return ghPriceAmount(amount); +}); diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index b9f7c2c882..8e0523bc62 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -19,7 +19,9 @@ text-align: center; border: 1px solid var(--whitegrey); border-radius: 2px; - padding: 8vmin 48px; + padding: 24px 48px; + background: white; + margin-bottom: 12px; } @media (max-width: 980px) { @@ -251,4 +253,4 @@ display: grid; grid-template-columns: 1fr 2fr; grid-gap: 20px; -} \ No newline at end of file +} diff --git a/app/templates/settings/membership.hbs b/app/templates/settings/membership.hbs index ed052ff1e8..a2c08ebe8d 100644 --- a/app/templates/settings/membership.hbs +++ b/app/templates/settings/membership.hbs @@ -139,58 +139,65 @@ {{#if this.fetchDefaultProduct.isRunning}} Loading... {{else}} - -
    - - -
    - -
    - {{this.currency}} - {{svg-jar "arrow-down-small"}} -
    - -
    + {{#if (enable-developer-experiments)}} + + {{else}} + +
    + + +
    + +
    + {{this.currency}} + {{svg-jar "arrow-down-small"}} +
    + +
    +
    -
    -
    +
    -
    - - {{this.currency}}/month -
    -
    - - {{this.currency}}/year +
    + + {{this.currency}}/month +
    +
    + + {{this.currency}}/year +
    -
    - {{#if this.stripePlanError}} -

    {{this.stripePlanError}}

    - {{/if}} - + {{#if this.stripePlanError}} +

    {{this.stripePlanError}}

    + {{/if}} + + {{/if}} Date: Fri, 4 Jun 2021 13:12:52 +0530 Subject: [PATCH 0417/3032] Wired new membership tiers UI to API refs https://github.com/TryGhost/Team/issues/712 closes https://github.com/TryGhost/Team/issues/717 The product API is updated to support `monthly/yearly_price` on each product instead of using list of stripe prices. This change updates the handling of membership settings to use the updated API instead of `stripe_prices` property. --- app/adapters/product.js | 6 +- app/components/gh-members-payments-setting.js | 100 ++++----- app/controllers/settings/membership.js | 207 +++++++----------- app/models/product.js | 3 +- app/transforms/stripe-price.js | 14 +- 5 files changed, 130 insertions(+), 200 deletions(-) diff --git a/app/adapters/product.js b/app/adapters/product.js index 21811abc08..b2f4c6a8a2 100644 --- a/app/adapters/product.js +++ b/app/adapters/product.js @@ -12,14 +12,10 @@ export default ApplicationAdapter.extend({ return this._super(...arguments); }, - urlForDeleteRecord(id, modelName, snapshot) { + urlForDeleteRecord() { let url = this._super(...arguments); let parsedUrl = new URL(url); - if (snapshot && snapshot.adapterOptions && snapshot.adapterOptions.cancel) { - parsedUrl.searchParams.set('cancel', 'true'); - } - return parsedUrl.toString(); } }); diff --git a/app/components/gh-members-payments-setting.js b/app/components/gh-members-payments-setting.js index eb51dfe30a..7f947c7a62 100644 --- a/app/components/gh-members-payments-setting.js +++ b/app/components/gh-members-payments-setting.js @@ -250,32 +250,46 @@ export default Component.extend({ }); }, - updatePortalPlans(monthlyPriceId, yearlyPriceId) { - let portalPlans = ['free']; - if (monthlyPriceId) { - portalPlans.push(monthlyPriceId); - } - if (yearlyPriceId) { - portalPlans.push(yearlyPriceId); - } - this.settings.set('portalPlans', portalPlans); - }, - saveProduct: task(function* () { - let pollTimeout = 0; - while (pollTimeout < RETRY_PRODUCT_SAVE_MAX_POLL) { - yield timeout(RETRY_PRODUCT_SAVE_POLL_LENGTH); + const products = yield this.store.query('product', {include: 'monthly_price, yearly_price'}); + this.product = products.firstObject; + if (this.product) { + const yearlyDiscount = this.calculateDiscount(5, 50); + this.product.set('monthlyPrice', { + nickname: 'Monthly', + amount: 500, + active: 1, + description: 'Full access', + currency: 'usd', + interval: 'month', + type: 'recurring' + }); + this.product.set('yearlyPrice', { + nickname: 'Yearly', + amount: 5000, + active: 1, + currency: 'usd', + description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access', + interval: 'year', + type: 'recurring' + }); - try { - const updatedProduct = yield this.product.save(); - return updatedProduct; - } catch (error) { - if (error.payload?.errors && error.payload.errors[0].code === 'STRIPE_NOT_CONFIGURED') { - pollTimeout += RETRY_PRODUCT_SAVE_POLL_LENGTH; - // no-op: will try saving again as stripe is not ready - continue; - } else { - throw error; + let pollTimeout = 0; + /** To allow Stripe config to be ready in backend, we poll the save product request */ + while (pollTimeout < RETRY_PRODUCT_SAVE_MAX_POLL) { + yield timeout(RETRY_PRODUCT_SAVE_POLL_LENGTH); + + try { + const updatedProduct = yield this.product.save(); + return updatedProduct; + } catch (error) { + if (error.payload?.errors && error.payload.errors[0].code === 'STRIPE_NOT_CONFIGURED') { + pollTimeout += RETRY_PRODUCT_SAVE_POLL_LENGTH; + // no-op: will try saving again as stripe is not ready + continue; + } else { + throw error; + } } } } @@ -289,41 +303,9 @@ export default Component.extend({ try { let response = yield this.settings.save(); - const products = yield this.store.query('product', {include: 'stripe_prices'}); - this.product = products.firstObject; - - if (this.product) { - const stripePrices = this.product.stripePrices || []; - const yearlyDiscount = this.calculateDiscount(5, 50); - stripePrices.push( - { - nickname: 'Monthly', - amount: 500, - active: 1, - description: 'Full access', - currency: 'usd', - interval: 'month', - type: 'recurring' - }, - { - nickname: 'Yearly', - amount: 5000, - active: 1, - currency: 'usd', - description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access', - interval: 'year', - type: 'recurring' - } - ); - this.product.set('stripePrices', stripePrices); - const updatedProduct = yield this.saveProduct.perform(); - const monthlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'month', 500, 'usd'); - const yearlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'year', 5000, 'usd'); - this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id); - this.settings.set('membersMonthlyPriceId', monthlyPrice.id); - this.settings.set('membersYearlyPriceId', yearlyPrice.id); - response = yield this.settings.save(); - } + yield this.saveProduct.perform(); + this.settings.set('portalPlans', ['free', 'monthly', 'yearly']); + response = yield this.settings.save(); this.set('membersStripeOpen', false); this.set('stripeConnectSuccess', true); diff --git a/app/controllers/settings/membership.js b/app/controllers/settings/membership.js index ad9d2536ee..5e4a15f9f4 100644 --- a/app/controllers/settings/membership.js +++ b/app/controllers/settings/membership.js @@ -24,9 +24,11 @@ export default class MembersAccessController extends Controller { @tracked showLeaveRouteModal = false; @tracked showPortalSettings = false; @tracked showStripeConnect = false; + @tracked showProductModal = false; @tracked product = null; - @tracked stripePrices = []; + @tracked products = null; + @tracked productModel = null; @tracked paidSignupRedirect; @tracked freeSignupRedirect; @tracked stripeMonthlyAmount = 5; @@ -59,10 +61,8 @@ export default class MembersAccessController extends Controller { get hasChangedPrices() { if (this.product) { - this.stripePrices = this.product.get('stripePrices') || []; - const activePrices = this.stripePrices.filter(price => !!price.active); - const monthlyPrice = this.getPrice(activePrices, 'monthly'); - const yearlyPrice = this.getPrice(activePrices, 'yearly'); + const monthlyPrice = this.product.get('monthlyPrice'); + const yearlyPrice = this.product.get('yearlyPrice'); if (monthlyPrice?.amount && parseInt(this.stripeMonthlyAmount, 10) !== (monthlyPrice.amount / 100)) { return true; @@ -77,7 +77,7 @@ export default class MembersAccessController extends Controller { @action setup() { - this.fetchDefaultProduct.perform(); + this.fetchProducts.perform(); this.updatePortalPreview(); } @@ -176,6 +176,23 @@ export default class MembersAccessController extends Controller { this.showStripeConnect = false; } + @action + async openEditProduct(product) { + this.productModel = product; + this.showProductModal = true; + } + + @action + async openNewProduct() { + this.productModel = this.store.createRecord('product'); + this.showProductModal = true; + } + + @action + closeProductModal() { + this.showProductModal = false; + } + @action openPortalSettings() { this.saveSettingsTask.perform(); @@ -207,22 +224,14 @@ export default class MembersAccessController extends Controller { } @action - updatePortalPreview({forceRefresh} = {}) { + updatePortalPreview({forceRefresh} = {forceRefresh: false}) { // TODO: can these be worked out from settings in membersUtils? const monthlyPrice = this.stripeMonthlyAmount * 100; const yearlyPrice = this.stripeYearlyAmount * 100; let portalPlans = this.settings.get('portalPlans') || []; - const currentMontlyPriceId = this.settings.get('membersMonthlyPriceId'); - const currentYearlyPriceId = this.settings.get('membersYearlyPriceId'); - let isMonthlyChecked = false; - let isYearlyChecked = false; - if (portalPlans.includes(currentMontlyPriceId)) { - isMonthlyChecked = true; - } - if (portalPlans.includes(currentYearlyPriceId)) { - isYearlyChecked = true; - } + let isMonthlyChecked = portalPlans.includes('monthly'); + let isYearlyChecked = portalPlans.includes('yearly'); const newUrl = new URL(this.membersUtils.getPortalPreviewUrl({ button: false, @@ -272,119 +281,20 @@ export default class MembersAccessController extends Controller { } } + @action + confirmProductSave() { + return this.fetchProducts.perform(); + } + @task *switchFromNoneTask() { return yield this.saveSettingsTask.perform({forceRefresh: true}); } - async saveProduct() { - const isStripeConnected = this.settings.get('stripeConnectAccountId'); - if (this.product && isStripeConnected) { - const stripePrices = this.product.stripePrices || []; - const monthlyAmount = this.stripeMonthlyAmount * 100; - const yearlyAmount = this.stripeYearlyAmount * 100; - const getActivePrice = (prices, type, amount) => { - return prices.find((price) => { - return ( - price.active && price.amount === amount && price.type === 'recurring' && - price.interval === type && price.currency.toLowerCase() === this.currency.toLowerCase() - ); - }); - }; - const monthlyPrice = getActivePrice(stripePrices, 'month', monthlyAmount); - const yearlyPrice = getActivePrice(stripePrices, 'year', yearlyAmount); - - if (!monthlyPrice) { - stripePrices.push( - { - nickname: 'Monthly', - amount: monthlyAmount, - active: 1, - currency: this.currency, - interval: 'month', - type: 'recurring' - } - ); - } - if (!yearlyPrice) { - stripePrices.push( - { - nickname: 'Yearly', - amount: this.stripeYearlyAmount * 100, - active: 1, - currency: this.currency, - interval: 'year', - type: 'recurring' - } - ); - } - if (monthlyPrice && yearlyPrice) { - this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id); - this.settings.set('membersMonthlyPriceId', monthlyPrice.id); - this.settings.set('membersYearlyPriceId', yearlyPrice.id); - return this.product; - } else { - this.product.set('stripePrices', stripePrices); - const savedProduct = await this.product.save(); - const updatedStripePrices = savedProduct.stripePrices || []; - const updatedMonthlyPrice = getActivePrice(updatedStripePrices, 'month', monthlyAmount); - const updatedYearlyPrice = getActivePrice(updatedStripePrices, 'year', yearlyAmount); - this.updatePortalPlans(updatedMonthlyPrice.id, updatedYearlyPrice.id); - this.settings.set('membersMonthlyPriceId', updatedMonthlyPrice.id); - this.settings.set('membersYearlyPriceId', updatedYearlyPrice.id); - return savedProduct; - } - } - } - - updatePortalPlans(monthlyPriceId, yearlyPriceId) { - let portalPlans = this.settings.get('portalPlans') || []; - const currentMontlyPriceId = this.settings.get('membersMonthlyPriceId'); - const currentYearlyPriceId = this.settings.get('membersYearlyPriceId'); - if (portalPlans.includes(currentMontlyPriceId)) { - portalPlans = portalPlans.filter(priceId => priceId !== currentMontlyPriceId); - portalPlans.pushObject(monthlyPriceId); - } - - if (portalPlans.includes(currentYearlyPriceId)) { - portalPlans = portalPlans.filter(priceId => priceId !== currentYearlyPriceId); - portalPlans.pushObject(yearlyPriceId); - } - this.settings.set('portalPlans', portalPlans); - } - - getPrice(prices, type) { - const monthlyPriceId = this.settings.get('membersMonthlyPriceId'); - const yearlyPriceId = this.settings.get('membersYearlyPriceId'); - - if (type === 'monthly') { - return ( - prices.find(price => price.id === monthlyPriceId) || - prices.find(price => price.nickname === 'Monthly') || - prices.find(price => price.interval === 'month') - ); - } - - if (type === 'yearly') { - return ( - prices.find(price => price.id === yearlyPriceId) || - prices.find(price => price.nickname === 'Yearly') || - prices.find(price => price.interval === 'year') - ); - } - return null; - } - - @task({drop: true}) - *fetchDefaultProduct() { - const products = yield this.store.query('product', {include: 'stripe_prices'}); - this.product = products.firstObject; - this.stripePrices = []; - if (this.product) { - this.stripePrices = this.product.get('stripePrices') || []; - const activePrices = this.stripePrices.filter(price => !!price.active); - const monthlyPrice = this.getPrice(activePrices, 'monthly'); - const yearlyPrice = this.getPrice(activePrices, 'yearly'); + setupPortalProduct(product) { + if (product) { + const monthlyPrice = product.get('monthlyPrice'); + const yearlyPrice = product.get('yearlyPrice'); if (monthlyPrice && monthlyPrice.amount) { this.stripeMonthlyAmount = (monthlyPrice.amount / 100); this.currency = monthlyPrice.currency; @@ -396,19 +306,27 @@ export default class MembersAccessController extends Controller { } } + @task({drop: true}) + *fetchProducts() { + this.products = yield this.store.query('product', {include: 'monthly_price,yearly_price'}); + this.product = this.products.firstObject; + this.setupPortalProduct(this.product); + } + @task({drop: true}) *saveSettingsTask(options) { yield this.validateStripePlans({updatePortalPreview: false}); - if (this.stripePlanError) { + if (this.stripePlanError && !this.config.get('enableDeveloperExperiments')) { return; } if (this.settings.get('errors').length !== 0) { return; } - - yield this.saveProduct(); + if (!this.config.get('enableDeveloperExperiments')) { + yield this.saveProduct(); + } const result = yield this.settings.save(); this.updatePortalPreview(options); @@ -416,10 +334,37 @@ export default class MembersAccessController extends Controller { return result; } + async saveProduct() { + const isStripeConnected = this.settings.get('stripeConnectAccountId'); + if (this.product && isStripeConnected) { + const monthlyAmount = this.stripeMonthlyAmount * 100; + const yearlyAmount = this.stripeYearlyAmount * 100; + + this.product.set('monthlyPrice', { + nickname: 'Monthly', + amount: monthlyAmount, + active: true, + currency: this.currency, + interval: 'month', + type: 'recurring' + }); + this.product.set('yearlyPrice', { + nickname: 'Yearly', + amount: yearlyAmount, + active: true, + currency: this.currency, + interval: 'year', + type: 'recurring' + }); + + const savedProduct = await this.product.save(); + return savedProduct; + } + } + resetPrices() { - const activePrices = this.stripePrices.filter(price => !!price.active); - const monthlyPrice = this.getPrice(activePrices, 'monthly'); - const yearlyPrice = this.getPrice(activePrices, 'yearly'); + const monthlyPrice = this.product.get('monthlyPrice'); + const yearlyPrice = this.product.get('yearlyPrice'); this.stripeMonthlyAmount = monthlyPrice ? (monthlyPrice.amount / 100) : 5; this.stripeYearlyAmount = yearlyPrice ? (yearlyPrice.amount / 100) : 50; diff --git a/app/models/product.js b/app/models/product.js index 6fd1ed6400..cdffe2b61b 100644 --- a/app/models/product.js +++ b/app/models/product.js @@ -7,5 +7,6 @@ export default Model.extend(ValidationEngine, { name: attr('string'), description: attr('string'), slug: attr('string'), - stripePrices: attr('stripe-price') + monthlyPrice: attr('stripe-price'), + yearlyPrice: attr('stripe-price') }); diff --git a/app/transforms/stripe-price.js b/app/transforms/stripe-price.js index a3ecaa4fdc..67a9e990bd 100644 --- a/app/transforms/stripe-price.js +++ b/app/transforms/stripe-price.js @@ -3,10 +3,16 @@ import Transform from '@ember-data/serializer/transform'; import {A as emberA, isArray as isEmberArray} from '@ember/array'; export default Transform.extend({ - deserialize(serialized = []) { - const stripePrices = serialized.map(itemDetails => StripePrice.create(itemDetails)); + deserialize(serialized) { + if (serialized === null || serialized === undefined) { + return null; + } else if (Array.isArray(serialized)) { + const stripePrices = serialized.map(itemDetails => StripePrice.create(itemDetails)); - return emberA(stripePrices); + return emberA(stripePrices); + } else { + return StripePrice.create(serialized); + } }, serialize(deserialized) { @@ -15,7 +21,7 @@ export default Transform.extend({ return item; }).compact(); } else { - return []; + return deserialized || null; } } }); From 59141415776a964a64505eddbca6d82666dd132c Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 13:15:49 +0530 Subject: [PATCH 0418/3032] Updated portal settings to use names in portal_plans setting refs https://github.com/TryGhost/Team/issues/753 The portal_plans setting was previously storing price ids for active monthly/yearly prices for the default product, which was done to allow multiple prices in Portal. Since the portal_plans setting is now reverted to use `monthly`/`yearly` named values to denote the availability of active monthly/yearly pricing on a product, this change updates the handling in portal settings modal to work with new settings. --- app/components/modal-portal-settings.hbs | 111 ++++++++++++++--------- app/components/modal-portal-settings.js | 72 +++------------ 2 files changed, 81 insertions(+), 102 deletions(-) diff --git a/app/components/modal-portal-settings.hbs b/app/components/modal-portal-settings.hbs index b69f6c3a2d..51ff0a157e 100644 --- a/app/components/modal-portal-settings.hbs +++ b/app/components/modal-portal-settings.hbs @@ -33,53 +33,74 @@
    {{#if this.membersUtils.isStripeEnabled}} -
    -
    -

    Prices available at signup

    -
    -
    -
    - {{#if this.prices}} - {{#each this.filteredPrices as |price|}} -
    - -
    - {{/each}} - {{/if}} -
    {{else}}
    You need to to take payments diff --git a/app/components/modal-portal-settings.js b/app/components/modal-portal-settings.js index 573caa9300..e16bb6925e 100644 --- a/app/components/modal-portal-settings.js +++ b/app/components/modal-portal-settings.js @@ -19,41 +19,11 @@ export default ModalComponent.extend({ customIcon: null, showLinksPage: false, showLeaveSettingsModal: false, - freeSignupRedirect: undefined, - paidSignupRedirect: undefined, - prices: null, isPreloading: true, portalPreviewGuid: 'modal-portal-settings', confirm() {}, - filteredPrices: computed('prices', 'settings.{portalPlans.[],membersMonthlyPriceId,membersYearlyPriceId}', function () { - const monthlyPriceId = this.settings.get('membersMonthlyPriceId'); - const yearlyPriceId = this.settings.get('membersYearlyPriceId'); - const portalPlans = this.settings.get('portalPlans'); - const prices = this.prices || []; - return prices.filter((d) => { - return [monthlyPriceId, yearlyPriceId].includes(d.id); - }).filter((d) => { - return d.amount !== 0 && d.type === 'recurring'; - }).map((price) => { - return { - ...price, - checked: !!portalPlans.find(d => d === price.id) - }; - }); - }), - - hasPaidPriceChecked: computed('prices', 'settings.portalPlans.[]', function () { - const portalPlans = this.settings.get('portalPlans'); - const prices = this.prices || []; - return prices.filter((d) => { - return d.amount !== 0 && d.type === 'recurring'; - }).some((price) => { - return !!portalPlans.find(d => d === price.id); - }); - }), - backgroundStyle: computed('settings.accentColor', function () { let color = this.settings.get('accentColor') || '#ffffff'; return htmlSafe(`background-color: ${color}`); @@ -87,6 +57,19 @@ export default ModalComponent.extend({ }); }), + isFreeChecked: computed('settings.{portalPlans.[],membersSignupAccess}', function () { + const allowedPlans = this.settings.get('portalPlans') || []; + return (this.settings.get('membersSignupAccess') === 'all' && allowedPlans.includes('free')); + }), + isMonthlyChecked: computed('settings.portalPlans.[]', 'isStripeConfigured', function () { + const allowedPlans = this.settings.get('portalPlans') || []; + return (this.membersUtils.isStripeEnabled && allowedPlans.includes('monthly')); + }), + isYearlyChecked: computed('settings.portalPlans.[]', 'isStripeConfigured', function () { + const allowedPlans = this.settings.get('portalPlans') || []; + return (this.membersUtils.isStripeEnabled && allowedPlans.includes('yearly')); + }), + init() { this._super(...arguments); this.buttonStyleOptions = [ @@ -106,14 +89,8 @@ export default ModalComponent.extend({ toggleFreePlan(isChecked) { this.updateAllowedPlan('free', isChecked); }, - toggleMonthlyPlan(isChecked) { - this.updateAllowedPlan('monthly', isChecked); - }, - toggleYearlyPlan(isChecked) { - this.updateAllowedPlan('yearly', isChecked); - }, - togglePlan(priceId, event) { - this.updateAllowedPlan(priceId, event.target.checked); + togglePlan(plan, event) { + this.updateAllowedPlan(plan, event.target.checked); }, togglePortalButton(showButton) { this.settings.set('portalButton', showButton); @@ -123,14 +100,6 @@ export default ModalComponent.extend({ this.settings.set('portalName', showSignupName); }, - setPaidSignupRedirect(url) { - this.set('paidSignupRedirect', url); - }, - - setFreeSignupRedirect(url) { - this.set('freeSignupRedirect', url); - }, - confirm() { return this.saveTask.perform(); }, @@ -267,7 +236,6 @@ export default ModalComponent.extend({ this.set('customIcon', this.settings.get('portalButtonIcon')); } - this.getAvailablePrices.perform(); this.siteUrl = this.config.get('blogUrl'); this.set('isPreloading', false); @@ -295,15 +263,5 @@ export default ModalComponent.extend({ } yield this.settings.save(); this.closeModal(); - }).drop(), - - getAvailablePrices: task(function* () { - const products = yield this.store.query('product', {include: 'stripe_prices'}); - const product = products.firstObject; - const prices = product.get('stripePrices'); - const activePrices = prices.filter((d) => { - return !!d.active; - }); - this.set('prices', activePrices); }).drop() }); From 263e3de38123d36c28febc000a434aa00dfd11b4 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 13:17:17 +0530 Subject: [PATCH 0419/3032] Cleaned unused methods in portal links refs https://github.com/TryGhost/Team/issues/684 Removes now unused methods for fetching list of prices to show in Portal links, since it was reverted back to showing monthly/yearly prices only. --- app/components/gh-portal-links.hbs | 63 +++++++++++++++++++----------- app/components/gh-portal-links.js | 30 +------------- 2 files changed, 42 insertions(+), 51 deletions(-) diff --git a/app/components/gh-portal-links.hbs b/app/components/gh-portal-links.hbs index 1c12723911..762d901790 100644 --- a/app/components/gh-portal-links.hbs +++ b/app/components/gh-portal-links.hbs @@ -81,29 +81,48 @@
    - {{#each this.filteredPrices as |price|}} - - Sign up/{{price.oldNickname}} - -
    -
    - {{#if isLink}} - {{this.siteUrl}}/#/portal/signup/{{price.oldId}} - {{else}} - data-portal="signup/{{price.oldId}}" - {{/if}} -
    - + + Sign up/Monthly + +
    +
    + {{#if isLink}} + {{this.siteUrl}}/#/portal/signup/monthly + {{else}} + data-portal="signup/monthly" + {{/if}}
    - - - {{/each}} + +
    + + + + Sign up/Yearly + +
    +
    + {{#if isLink}} + {{this.siteUrl}}/#/portal/signup/yearly + {{else}} + data-portal="signup/yearly" + {{/if}} +
    + +
    + + Sign up/Free diff --git a/app/components/gh-portal-links.js b/app/components/gh-portal-links.js index f35bd2e3fe..d79782a838 100644 --- a/app/components/gh-portal-links.js +++ b/app/components/gh-portal-links.js @@ -13,25 +13,6 @@ export default Component.extend({ prices: null, copiedPrice: null, - filteredPrices: computed('prices', 'settings.portalPlans.[]', function () { - const portalPlans = this.get('settings.portalPlans'); - const monthlyPriceId = this.settings.get('membersMonthlyPriceId'); - const yearlyPriceId = this.settings.get('membersYearlyPriceId'); - const prices = this.prices || []; - return prices.filter((d) => { - return [monthlyPriceId, yearlyPriceId].includes(d.id); - }).filter((d) => { - return d.amount !== 0 && d.type === 'recurring'; - }).map((price) => { - return { - ...price, - oldId: price.interval === 'month' ? 'monthly' : 'yearly', - oldNickname: price.interval === 'month' ? 'Monthly' : 'Yearly', - checked: !!portalPlans.find(d => d === price.id) - }; - }); - }), - toggleValue: computed('isLink', function () { return this.isLink ? 'Data attributes' : 'Links'; }), @@ -72,14 +53,5 @@ export default Component.extend({ } copyTextToClipboard(data); yield timeout(this.isTesting ? 50 : 3000); - }), - getAvailablePrices: task(function* () { - const products = yield this.store.query('product', {include: 'stripe_prices'}); - const product = products.firstObject; - const prices = product.get('stripePrices'); - const activePrices = prices.filter((d) => { - return !!d.active; - }); - this.set('prices', activePrices); - }).drop() + }) }); From 3517196118f27e2cdddbfa722f1539876fa962ea Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 13:19:44 +0530 Subject: [PATCH 0420/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20visible=20add?= =?UTF-8?q?=20complimentary=20button=20without=20Stripe=20enabled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://github.com/TryGhost/Team/issues/742 The button to add a complimentary subscription for a member was visible even if Stripe was not connected on the site, and errored out with nasty red banner. This hides the `Add complimentary` button for member if stripe is not enabled on the site. --- app/components/gh-member-settings-form-cp.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/components/gh-member-settings-form-cp.js b/app/components/gh-member-settings-form-cp.js index 182493f23d..1f885c033f 100644 --- a/app/components/gh-member-settings-form-cp.js +++ b/app/components/gh-member-settings-form-cp.js @@ -30,6 +30,9 @@ export default class extends Component { } get isAddComplimentaryAllowed() { + if (!this.membersUtils.isStripeEnabled) { + return false; + } let subscriptions = this.member.get('subscriptions') || []; const hasZeroPriceSub = subscriptions.find((sub) => { return !sub?.price?.amount; From e39bce95cfaf326a29c918387485c8aed870ab14 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 13:22:20 +0530 Subject: [PATCH 0421/3032] Updated setup wizard pricing to use new product API refs https://github.com/TryGhost/Team/issues/721 The setup wizard in Admin handles creating default prices as well as handling new price changes on default Product. This change updates the handling to use updated Products API with support for `monthly/yearly_price` values that offloads price handling to backend and makes the logic simpler. Also updates the stripe connect flow to use new API for creating default prices. --- .../gh-launch-wizard/connect-stripe.js | 61 +++++------- app/components/gh-launch-wizard/finalise.js | 94 ++++--------------- .../gh-launch-wizard/set-pricing.js | 58 ++---------- 3 files changed, 50 insertions(+), 163 deletions(-) diff --git a/app/components/gh-launch-wizard/connect-stripe.js b/app/components/gh-launch-wizard/connect-stripe.js index 984d90d9b8..3bbf7378fc 100644 --- a/app/components/gh-launch-wizard/connect-stripe.js +++ b/app/components/gh-launch-wizard/connect-stripe.js @@ -80,17 +80,6 @@ export default class GhLaunchWizardConnectStripeComponent extends Component { }); } - updatePortalPlans(monthlyPriceId, yearlyPriceId) { - let portalPlans = ['free']; - if (monthlyPriceId) { - portalPlans.push(monthlyPriceId); - } - if (yearlyPriceId) { - portalPlans.push(yearlyPriceId); - } - this.settings.set('portalPlans', portalPlans); - } - @task({drop: true}) *saveProduct() { let pollTimeout = 0; @@ -169,38 +158,30 @@ export default class GhLaunchWizardConnectStripeComponent extends Component { try { yield this.settings.save(); - const products = yield this.store.query('product', {include: 'stripe_prices'}); + const products = yield this.store.query('product', {include: 'monthly_price,yearly_price'}); this.product = products.firstObject; if (this.product) { - const stripePrices = this.product.stripePrices || []; const yearlyDiscount = this.calculateDiscount(5, 50); - stripePrices.push( - { - nickname: 'Monthly', - amount: 500, - active: 1, - description: 'Full access', - currency: 'usd', - interval: 'month', - type: 'recurring' - }, - { - nickname: 'Yearly', - amount: 5000, - active: 1, - currency: 'usd', - description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access', - interval: 'year', - type: 'recurring' - } - ); - this.product.set('stripePrices', stripePrices); - const updatedProduct = yield this.saveProduct.perform(); - const monthlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'month', 500, 'usd'); - const yearlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'year', 5000, 'usd'); - this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id); - this.settings.set('membersMonthlyPriceId', monthlyPrice.id); - this.settings.set('membersYearlyPriceId', yearlyPrice.id); + this.product.set('monthlyPrice', { + nickname: 'Monthly', + amount: 500, + active: 1, + description: 'Full access', + currency: 'usd', + interval: 'month', + type: 'recurring' + }); + this.product.set('yearlyPrice', { + nickname: 'Yearly', + amount: 5000, + active: 1, + currency: 'usd', + description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access', + interval: 'year', + type: 'recurring' + }); + yield this.saveProduct.perform(); + this.settings.set('portalPlans', ['free', 'monthly', 'yearly']); yield this.settings.save(); } diff --git a/app/components/gh-launch-wizard/finalise.js b/app/components/gh-launch-wizard/finalise.js index 54c845c245..da6bf3a386 100644 --- a/app/components/gh-launch-wizard/finalise.js +++ b/app/components/gh-launch-wizard/finalise.js @@ -14,89 +14,33 @@ export default class GhLaunchWizardFinaliseComponent extends Component { this.settings.rollbackAttributes(); } - updatePortalPlans(monthlyPriceId, yearlyPriceId, data) { - let portalPlans = this.settings.get('portalPlans') || []; - const currentMontlyPriceId = this.settings.get('membersMonthlyPriceId'); - const currentYearlyPriceId = this.settings.get('membersYearlyPriceId'); - if (portalPlans.includes(currentMontlyPriceId)) { - portalPlans = portalPlans.filter(priceId => priceId !== currentMontlyPriceId); - } - if (data.isMonthlyChecked) { - portalPlans.pushObject(monthlyPriceId); - } - - if (portalPlans.includes(currentYearlyPriceId)) { - portalPlans = portalPlans.filter(priceId => priceId !== currentYearlyPriceId); - } - if (data.isYearlyChecked) { - portalPlans.pushObject(yearlyPriceId); - } - portalPlans = portalPlans.filter(priceId => priceId !== 'free'); - if (data.isFreeChecked) { - portalPlans.pushObject('free'); - } - this.settings.set('portalPlans', portalPlans); - } - async saveProduct() { const data = this.args.getData(); this.product = data?.product; if (this.product) { - const stripePrices = this.product.stripePrices || []; const monthlyAmount = data.monthlyAmount * 100; const yearlyAmount = data.yearlyAmount * 100; const currency = data.currency; - const getActivePrice = (prices, type, amount) => { - return prices.find((price) => { - return ( - price.active && price.amount === amount && price.type === 'recurring' && - price.interval === type && price.currency.toLowerCase() === currency.toLowerCase() - ); - }); + const monthlyPrice = { + nickname: 'Monthly', + amount: monthlyAmount, + active: 1, + currency: currency, + interval: 'month', + type: 'recurring' }; - const monthlyPrice = getActivePrice(stripePrices, 'month', monthlyAmount); - const yearlyPrice = getActivePrice(stripePrices, 'year', yearlyAmount); - - if (!monthlyPrice) { - stripePrices.push( - { - nickname: 'Monthly', - amount: monthlyAmount, - active: 1, - currency: currency, - interval: 'month', - type: 'recurring' - } - ); - } - if (!yearlyPrice) { - stripePrices.push( - { - nickname: 'Yearly', - amount: yearlyAmount, - active: 1, - currency: currency, - interval: 'year', - type: 'recurring' - } - ); - } - if (monthlyPrice && yearlyPrice) { - this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id, data); - this.settings.set('membersMonthlyPriceId', monthlyPrice.id); - this.settings.set('membersYearlyPriceId', yearlyPrice.id); - return this.product; - } else { - this.product.set('stripePrices', stripePrices); - const savedProduct = await this.product.save(); - const updatedStripePrices = savedProduct.stripePrices || []; - const updatedMonthlyPrice = getActivePrice(updatedStripePrices, 'month', monthlyAmount); - const updatedYearlyPrice = getActivePrice(updatedStripePrices, 'year', yearlyAmount); - this.updatePortalPlans(updatedMonthlyPrice.id, updatedYearlyPrice.id, data); - this.settings.set('membersMonthlyPriceId', updatedMonthlyPrice.id); - this.settings.set('membersYearlyPriceId', updatedYearlyPrice.id); - return savedProduct; - } + const yearlyPrice = { + nickname: 'Yearly', + amount: yearlyAmount, + active: 1, + currency: currency, + interval: 'year', + type: 'recurring' + }; + this.product.set('monthlyPrice', monthlyPrice); + this.product.set('yearlyPrice', yearlyPrice); + const savedProduct = await this.product.save(); + return savedProduct; } } diff --git a/app/components/gh-launch-wizard/set-pricing.js b/app/components/gh-launch-wizard/set-pricing.js index bafba8401b..9ee8f27af6 100644 --- a/app/components/gh-launch-wizard/set-pricing.js +++ b/app/components/gh-launch-wizard/set-pricing.js @@ -46,38 +46,12 @@ export default class GhLaunchWizardSetPricingComponent extends Component { return envConfig.environment !== 'development' && !/^https:/.test(siteUrl); } - get disabled() { - return false; - } - get isPaidPriceDisabled() { - return this.disabled || !this.membersUtils.isStripeEnabled; + return !this.membersUtils.isStripeEnabled; } get isFreeDisabled() { - return this.disabled || this.settings.get('membersSignupAccess') !== 'all'; - } - - getPrice(prices, type) { - const monthlyPriceId = this.settings.get('membersMonthlyPriceId'); - const yearlyPriceId = this.settings.get('membersYearlyPriceId'); - - if (type === 'monthly') { - return ( - prices.find(price => price.id === monthlyPriceId) || - prices.find(price => price.nickname === 'Monthly') || - prices.find(price => price.interval === 'month') - ); - } - - if (type === 'yearly') { - return ( - prices.find(price => price.id === yearlyPriceId) || - prices.find(price => price.nickname === 'Yearly') || - prices.find(price => price.interval === 'year') - ); - } - return null; + return this.settings.get('membersSignupAccess') !== 'all'; } @action @@ -182,7 +156,6 @@ export default class GhLaunchWizardSetPricingComponent extends Component { const storedData = this.args.getData(); if (storedData?.product) { this.product = storedData.product; - this.stripePrices = this.product.get('stripePrices') || []; if (storedData.isMonthlyChecked !== undefined) { this.isMonthlyChecked = storedData.isMonthlyChecked; @@ -199,27 +172,16 @@ export default class GhLaunchWizardSetPricingComponent extends Component { this.stripeMonthlyAmount = storedData.monthlyAmount; this.stripeYearlyAmount = storedData.yearlyAmount; } else { - const products = yield this.store.query('product', {include: 'stripe_prices'}); + const products = yield this.store.query('product', {include: 'monthly_price,yearly_price'}); this.product = products.firstObject; let portalPlans = this.settings.get('portalPlans') || []; - const currentMontlyPriceId = this.settings.get('membersMonthlyPriceId'); - const currentYearlyPriceId = this.settings.get('membersYearlyPriceId'); - this.isMonthlyChecked = false; - this.isYearlyChecked = false; - this.isFreeChecked = false; - if (portalPlans.includes(currentMontlyPriceId)) { - this.isMonthlyChecked = true; - } - if (portalPlans.includes(currentYearlyPriceId)) { - this.isYearlyChecked = true; - } - if (portalPlans.includes('free')) { - this.isFreeChecked = true; - } - this.stripePrices = this.product.get('stripePrices') || []; - const activePrices = this.stripePrices.filter(price => !!price.active); - const monthlyPrice = this.getPrice(activePrices, 'monthly'); - const yearlyPrice = this.getPrice(activePrices, 'yearly'); + + this.isMonthlyChecked = portalPlans.includes('monthly'); + this.isYearlyChecked = portalPlans.includes('yearly'); + this.isFreeChecked = portalPlans.includes('free'); + + const monthlyPrice = this.product.get('monthlyPrice'); + const yearlyPrice = this.product.get('yearlyPrice'); if (monthlyPrice && monthlyPrice.amount) { this.stripeMonthlyAmount = (monthlyPrice.amount / 100); this.currency = monthlyPrice.currency; From e70a0ae4bf2dbf5ec9566cab4becbd1e64ed4461 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 4 Jun 2021 10:59:42 +0200 Subject: [PATCH 0422/3032] Updated product card styles (alpha) --- .../gh-membership-products-alpha.hbs | 44 ++++++--------- app/styles/layouts/main.css | 4 +- app/styles/layouts/products.css | 54 ++++++++++++++++--- 3 files changed, 64 insertions(+), 38 deletions(-) diff --git a/app/components/gh-membership-products-alpha.hbs b/app/components/gh-membership-products-alpha.hbs index 70a6c9e103..00962aa5cf 100644 --- a/app/components/gh-membership-products-alpha.hbs +++ b/app/components/gh-membership-products-alpha.hbs @@ -1,36 +1,24 @@ {{#each this.products as |product|}} -
    -
    -
    -

    - {{product.name}} -

    -

    - {{product.description}} -

    -
    -
    -
    -

    - Pricing +
    + +
    +

    + {{product.name}}

    - {{product.monthlyPrice.currency}} - {{gh-price-amount product.monthlyPrice.amount}}/month -

    -

    - {{product.monthlyPrice.currency}} - {{gh-price-amount product.yearlyPrice.amount}}/year + {{product.description}}

    -
    -
    -
    -
    - -
    +
    + Pricing +

    + {{gh-price-amount product.monthlyPrice.amount}} {{product.monthlyPrice.currency}}/month +

    +

    + {{gh-price-amount product.yearlyPrice.amount}} {{product.monthlyPrice.currency}}/year +

    {{/each}} diff --git a/app/styles/layouts/main.css b/app/styles/layouts/main.css index ca78ca0160..de6d77680a 100644 --- a/app/styles/layouts/main.css +++ b/app/styles/layouts/main.css @@ -1228,12 +1228,12 @@ /* Grey background modifiers */ .gh-main-section-content.grey .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red), -.gh-expandable-content .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):not(.gh-btn-black) { +.gh-expandable-content .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):not(.gh-btn-black):not(.gh-btn-link) { background: var(--whitegrey-d2); } .gh-main-section-content.grey .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):hover, -.gh-expandable-content .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):hover { +.gh-expandable-content .gh-btn:not(.gh-btn-white):not(.gh-btn-green):not(.gh-btn-blue):not(.gh-btn-red):not(.gh-btn-link):hover { background: color-mod(var(--whitegrey-d2) l(-4%)); } diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index 8e0523bc62..75e2e3d9f3 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -12,14 +12,13 @@ } .gh-product-card { + position:relative; display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; + align-items: flex-start; + justify-content: space-between; border: 1px solid var(--whitegrey); - border-radius: 2px; - padding: 24px 48px; + border-radius: 3px; + padding: 24px; background: white; margin-bottom: 12px; } @@ -30,16 +29,55 @@ } } +.gh-product-card-editbutton { + position: absolute; + right: 24px; + top: 16px; +} + +.gh-product-card-block { + flex-basis: 50%; +} + +.gh-product-card-block:not(:first-of-type) { + border-left: 1px solid var(--whitegrey); + padding-left: 16px; +} + .gh-product-card-name { - font-size: 1.75rem; + font-size: 1.8rem; + font-weight: 500; margin: 0; } +.gh-product-card-heading { + display: inline-block; + font-size: 1.3rem; + font-weight: 600; + margin-bottom: 2px; +} + .gh-product-card-description { - margin: 0 0 16px; + margin-top: 2px; + color: var(--midgrey); +} + +.gh-product-card-price { + margin: 0 0 2px; + font-size: 1.3rem; color: var(--midgrey); } +.gh-product-card-price .amount, +.gh-product-card-price .currency { + font-weight: 600; + color: var(--darkgrey); +} + +.gh-product-card-price .currency { + text-transform: uppercase; +} + .gh-product-list-icon { display: flex; align-items: flex-end; From add40be9db2391a9567806b5c797af763c97fa20 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 4 Jun 2021 11:35:28 +0200 Subject: [PATCH 0423/3032] Updated add product UI style --- .../gh-membership-products-alpha.hbs | 14 +++++------ app/styles/layouts/products.css | 23 ++++++++++++++++++- app/styles/patterns/buttons.css | 8 +++++++ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/app/components/gh-membership-products-alpha.hbs b/app/components/gh-membership-products-alpha.hbs index 00962aa5cf..70206d68cb 100644 --- a/app/components/gh-membership-products-alpha.hbs +++ b/app/components/gh-membership-products-alpha.hbs @@ -1,3 +1,4 @@ +
    {{#each this.products as |product|}}
    {{/each}} -
    -
    -

    - + New tier -

    -
    + +
    {{#if this.showProductModal}} @@ -39,4 +39,4 @@ @confirm={{this.confirmProductSave}} @close={{this.closeProductModal}} @modifier="action wide" /> -{{/if}} +{{/if}} \ No newline at end of file diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index 75e2e3d9f3..79609e68a7 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -11,16 +11,20 @@ } } +.gh-product-cards { + margin: 0 0 24px; +} + .gh-product-card { position:relative; display: flex; align-items: flex-start; justify-content: space-between; - border: 1px solid var(--whitegrey); border-radius: 3px; padding: 24px; background: white; margin-bottom: 12px; + box-shadow: 0 1px 4px -1px rgba(0,0,0,0.1); } @media (max-width: 980px) { @@ -78,6 +82,23 @@ text-transform: uppercase; } +.gh-product-cards-footer { + display: flex; + align-items: center; + margin-top: -7px; + color: var(--midgrey); + font-size: 1.35rem; +} + +.gh-btn-add-product, +.gh-btn-add-product:hover { + margin-right: 5px; +} + +.gh-btn-add-product svg { + margin-right: 2px; +} + .gh-product-list-icon { display: flex; align-items: flex-end; diff --git a/app/styles/patterns/buttons.css b/app/styles/patterns/buttons.css index be44e844d6..46bd6ee805 100644 --- a/app/styles/patterns/buttons.css +++ b/app/styles/patterns/buttons.css @@ -288,6 +288,14 @@ svg.gh-btn-icon-right { stroke: #fff; } +.gh-btn-icon.green svg path { + stroke: var(--green); +} + +.gh-btn-icon.red svg path { + stroke: var(--red); +} + .gh-btn-icon-no-margin { margin: 0; } From 5bf55539afa0cab447575e53525f05140e04552a Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 15:34:27 +0530 Subject: [PATCH 0424/3032] Added portal option to default product for tiers UI refs https://github.com/TryGhost/Team/issues/715 By default, the first product/tier is available in Portal at the moment, this adds an attribute that can be used to denote which product is active in Portal in UI --- app/components/gh-membership-products-alpha.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/components/gh-membership-products-alpha.js b/app/components/gh-membership-products-alpha.js index f95a6d9c54..350666fa28 100644 --- a/app/components/gh-membership-products-alpha.js +++ b/app/components/gh-membership-products-alpha.js @@ -14,7 +14,15 @@ export default class extends Component { @tracked productModel = null; get products() { - return this.args.products; + return this.args.products.map((product, idx) => { + if (idx === 0) { + return { + ...product.toJSON(), + portal: true + }; + } + return product; + }); } @action From bea5e5735b1a478c89d97c82057b39b397d47d26 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 16:13:04 +0530 Subject: [PATCH 0425/3032] Removed portal option for default product for tiers UI no refs This change reverts the last commit to add portal option to product as it breaks the model that is passed to popup. This reverts commit 5bf55539afa0cab447575e53525f05140e04552a. --- app/components/gh-membership-products-alpha.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/app/components/gh-membership-products-alpha.js b/app/components/gh-membership-products-alpha.js index 350666fa28..f95a6d9c54 100644 --- a/app/components/gh-membership-products-alpha.js +++ b/app/components/gh-membership-products-alpha.js @@ -14,15 +14,7 @@ export default class extends Component { @tracked productModel = null; get products() { - return this.args.products.map((product, idx) => { - if (idx === 0) { - return { - ...product.toJSON(), - portal: true - }; - } - return product; - }); + return this.args.products; } @action From 5131b18f7be2ca8a9c63d733436ab09067c9e0d5 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 4 Jun 2021 13:02:16 +0200 Subject: [PATCH 0426/3032] Adding 'Available in Portal' badge to product card --- app/components/gh-membership-products-alpha.hbs | 5 ++++- app/styles/layouts/products.css | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/components/gh-membership-products-alpha.hbs b/app/components/gh-membership-products-alpha.hbs index 70206d68cb..ac0e1214c1 100644 --- a/app/components/gh-membership-products-alpha.hbs +++ b/app/components/gh-membership-products-alpha.hbs @@ -1,5 +1,5 @@
    -{{#each this.products as |product|}} +{{#each this.products as |product productIdx|}}
    Pricing diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index 79609e68a7..dd74993a26 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -62,7 +62,7 @@ } .gh-product-card-description { - margin-top: 2px; + margin: 2px 0 0; color: var(--midgrey); } From 6f484914c27fbfc7313de3906b7bb0cb69ac3316 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 16:55:10 +0530 Subject: [PATCH 0427/3032] Fixed incorrect existing product check in modal refs https://github.com/TryGhost/Team/issues/715 --- app/components/modal-product.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/modal-product.js b/app/components/modal-product.js index 22370712e1..65a818d1a3 100644 --- a/app/components/modal-product.js +++ b/app/components/modal-product.js @@ -60,7 +60,7 @@ export default class ModalProductPrice extends ModalBase { } get isExistingProduct() { - return !!this.model.product; + return !this.model.product.isNew; } // TODO: rename to confirm() when modals have full Glimmer support From 3b9592382935b9c23c8c5e3e9e8eba3bff8bce88 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Fri, 4 Jun 2021 17:43:46 +0530 Subject: [PATCH 0428/3032] Removed unused prices method in portal links no refs The `getAvailablePrices` method was removed from portal links as we no longer loop over prices for links but use monthly/yearly directly instead. --- app/components/gh-portal-links.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/gh-portal-links.js b/app/components/gh-portal-links.js index d79782a838..d2b0880a8b 100644 --- a/app/components/gh-portal-links.js +++ b/app/components/gh-portal-links.js @@ -24,7 +24,6 @@ export default Component.extend({ init() { this._super(...arguments); this.siteUrl = this.config.get('blogUrl'); - this.getAvailablePrices.perform(); }, actions: { From 133a82c4bcba7665c173d559bd6cf824585c3b93 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 4 Jun 2021 14:27:33 +0200 Subject: [PATCH 0429/3032] Updated 'Add product' modal styles --- .../gh-membership-products-alpha.hbs | 1 + app/components/modal-product.hbs | 102 +++++++++--------- app/components/modal-product.js | 2 +- app/styles/layouts/products.css | 6 +- app/styles/patterns/forms.css | 3 +- 5 files changed, 59 insertions(+), 55 deletions(-) diff --git a/app/components/gh-membership-products-alpha.hbs b/app/components/gh-membership-products-alpha.hbs index ac0e1214c1..bee08e99ca 100644 --- a/app/components/gh-membership-products-alpha.hbs +++ b/app/components/gh-membership-products-alpha.hbs @@ -1,3 +1,4 @@ +
    {{#each this.products as |product productIdx|}}
    diff --git a/app/components/modal-product.hbs b/app/components/modal-product.hbs index e7fce91ee6..bdc7a74453 100644 --- a/app/components/modal-product.hbs +++ b/app/components/modal-product.hbs @@ -29,59 +29,57 @@ @class="gh-input" /> -
    - -
    - - -
    - -
    - {{this.currency}} - {{svg-jar "arrow-down-small"}} -
    - -
    -
    + +
    + + +
    + +
    + {{this.currency}} + {{svg-jar "arrow-down-small"}} +
    + +
    -
    +
    +
    -
    - - {{this.currency}}/month -
    -
    - - {{this.currency}}/year -
    +
    + + {{this.currency}}/month
    - {{#if this.stripePlanError}} -

    {{this.stripePlanError}}

    - {{/if}} - -
    +
    + + {{this.currency}}/year +
    +
    + {{#if this.stripePlanError}} +

    {{this.stripePlanError}}

    + {{/if}} +
    @@ -97,10 +95,10 @@ > Cancel -
    \ No newline at end of file diff --git a/app/components/modal-product.js b/app/components/modal-product.js index 65a818d1a3..de36513c28 100644 --- a/app/components/modal-product.js +++ b/app/components/modal-product.js @@ -54,7 +54,7 @@ export default class ModalProductPrice extends ModalBase { get title() { if (this.isExistingProduct) { - return `Product - ${this.product.name || 'No Name'}`; + return `Edit product`; } return 'New Product'; } diff --git a/app/styles/layouts/products.css b/app/styles/layouts/products.css index dd74993a26..53f0b4505c 100644 --- a/app/styles/layouts/products.css +++ b/app/styles/layouts/products.css @@ -50,7 +50,7 @@ .gh-product-card-name { font-size: 1.8rem; - font-weight: 500; + font-weight: 600; margin: 0; } @@ -308,6 +308,10 @@ margin-bottom: 32px; } +.gh-product-priceform-block .form-group:last-of-type { + margin-bottom: 0; +} + .gh-product-priceform-pricecurrency { display: grid; grid-template-columns: 1fr 2fr; diff --git a/app/styles/patterns/forms.css b/app/styles/patterns/forms.css index 88f4f848ee..a5d95dc520 100644 --- a/app/styles/patterns/forms.css +++ b/app/styles/patterns/forms.css @@ -798,7 +798,8 @@ textarea { } .form-rich-radio .gh-radio-label .description h4 { - font-size: 1.4rem; + font-size: 1.5rem; + font-weight: 600; margin: 0; padding: 0; line-height: 1.4em; From 5f7bd3a26ae261904904bed0bfb483235ab4b959 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 4 Jun 2021 15:18:39 +0200 Subject: [PATCH 0430/3032] Updated product badge color --- app/components/gh-membership-products-alpha.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/gh-membership-products-alpha.hbs b/app/components/gh-membership-products-alpha.hbs index bee08e99ca..c869f86836 100644 --- a/app/components/gh-membership-products-alpha.hbs +++ b/app/components/gh-membership-products-alpha.hbs @@ -13,7 +13,7 @@ {{product.description}}

    {{#if (eq productIdx 0)}} - Available in Portal + Available in Portal {{/if}}
    From 830fa413ac5a1dd9a6ec813e628f6a4d7513a070 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Fri, 4 Jun 2021 15:36:18 +0200 Subject: [PATCH 0431/3032] Display Portal badge on product card condition --- app/components/gh-membership-products-alpha.hbs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/gh-membership-products-alpha.hbs b/app/components/gh-membership-products-alpha.hbs index c869f86836..bc1b645e7d 100644 --- a/app/components/gh-membership-products-alpha.hbs +++ b/app/components/gh-membership-products-alpha.hbs @@ -12,8 +12,8 @@

    {{product.description}}

    - {{#if (eq productIdx 0)}} - Available in Portal + {{#if (and (eq productIdx 0) (not (eq products.length 1)))}} + Available in Portal {{/if}}
    From f1628a572aaba600b00f36a96683e3d3a00d3a12 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 4 Jun 2021 23:23:59 +0000 Subject: [PATCH 0432/3032] Update dependency eslint to v7.28.0 --- package.json | 2 +- yarn.lock | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 08f50a938b..763a67fe0d 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "ember-truth-helpers": "3.0.0", "ember-useragent": "0.10.0", "emberx-file-input": "1.2.1", - "eslint": "7.27.0", + "eslint": "7.28.0", "eslint-plugin-ghost": "2.2.0", "faker": "5.5.3", "fs-extra": "10.0.0", diff --git a/yarn.lock b/yarn.lock index 5c0831157b..c3a84af22c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1485,15 +1485,15 @@ "@embroider/macros" "0.36.0" ember-cli-babel "^7.22.1" -"@eslint/eslintrc@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" - integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== +"@eslint/eslintrc@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" + integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg== dependencies: ajv "^6.12.4" debug "^4.1.1" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" @@ -7343,13 +7343,13 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@7.27.0: - version "7.27.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.27.0.tgz#665a1506d8f95655c9274d84bd78f7166b07e9c7" - integrity sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA== +eslint@7.28.0: + version "7.28.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820" + integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g== dependencies: "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.1" + "@eslint/eslintrc" "^0.4.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -7366,7 +7366,7 @@ eslint@7.27.0: fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" + glob-parent "^5.1.2" globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" @@ -8468,7 +8468,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -8538,7 +8538,7 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -globals@^13.6.0: +globals@^13.6.0, globals@^13.9.0: version "13.9.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== From 8c952ff834b8606b855e694f674293117d7680fd Mon Sep 17 00:00:00 2001 From: Sam Lord Date: Mon, 7 Jun 2021 11:25:16 +0100 Subject: [PATCH 0433/3032] v4.6.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 96b4fcda11..3c12bc057f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.6.4", + "version": "4.6.5", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From 4ad993e2d1299432a242dbd1513a131fc18f8204 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 7 Jun 2021 16:36:21 +0100 Subject: [PATCH 0434/3032] Added settings for newsletter header, title style, and feature image (#1993) refs https://github.com/TryGhost/Team/issues/755 reqs https://github.com/TryGhost/Ghost/pull/13006 - updated settings model to match new server-side settings - updated email customisation modal behind the dev experiments flag - adjusted layout to move to a fixed top bar and scrollable sidebar - added image upload, toggles and selections for new settings - updated preview to match selected settings Co-authored-by: Sanne de Vries --- app/components/gh-file-input.js | 4 + app/components/gh-uploader.hbs | 8 +- app/components/gh-uploader.js | 25 ++ .../modal-email-design-settings-labs.hbs | 300 ++++++++++++++++++ .../modal-email-design-settings-labs.js | 92 ++++++ .../modal-email-design-settings.hbs | 2 +- app/models/setting.js | 8 +- app/styles/components/modals.css | 127 +++++++- app/styles/layouts/members.css | 72 ++++- app/styles/patterns/buttons.css | 27 +- app/templates/settings/members-email.hbs | 12 +- public/assets/icons/align-center.svg | 3 + public/assets/icons/align-left.svg | 3 + 13 files changed, 667 insertions(+), 16 deletions(-) create mode 100644 app/components/modal-email-design-settings-labs.hbs create mode 100644 app/components/modal-email-design-settings-labs.js create mode 100644 public/assets/icons/align-center.svg create mode 100644 public/assets/icons/align-left.svg diff --git a/app/components/gh-file-input.js b/app/components/gh-file-input.js index 326e087eeb..382a2979b3 100644 --- a/app/components/gh-file-input.js +++ b/app/components/gh-file-input.js @@ -4,6 +4,10 @@ import XFileInput from 'emberx-file-input/components/x-file-input'; // upgraded to emberx-file-input@1.2.0 export default XFileInput.extend({ + didInsertElement() { + this.onInsert?.(this.element.querySelector('input[type="file"]')); + }, + change(e) { let action = this.action; let files = this.files(e); diff --git a/app/components/gh-uploader.hbs b/app/components/gh-uploader.hbs index 3325ebd9c5..dc2e28aa44 100644 --- a/app/components/gh-uploader.hbs +++ b/app/components/gh-uploader.hbs @@ -4,5 +4,11 @@ files=this.files isUploading=this._uploadFiles.isRunning progressBar=(component "gh-progress-bar" percentage=this.uploadPercentage) - setFiles=(action 'setFiles') + setFiles=(action "setFiles") + registerFileInput=(action "registerFileInput") + triggerFileDialog=(action "triggerFileDialog") + imageExtensions=this.imageExtensions + imageMimeTypes=this.imageMimeTypes + iconExtensions=this.iconExtensions + iconMimeTypes=this.iconMimeTypes )}} diff --git a/app/components/gh-uploader.js b/app/components/gh-uploader.js index 9bb5d17144..cf87347da6 100644 --- a/app/components/gh-uploader.js +++ b/app/components/gh-uploader.js @@ -1,6 +1,12 @@ import Component from '@ember/component'; import EmberObject from '@ember/object'; import ghostPaths from 'ghost-admin/utils/ghost-paths'; +import { + ICON_EXTENSIONS, + ICON_MIME_TYPES, + IMAGE_EXTENSIONS, + IMAGE_MIME_TYPES +} from 'ghost-admin/components/gh-image-uploader'; import {all, task} from 'ember-concurrency'; import {get} from '@ember/object'; import {isArray} from '@ember/array'; @@ -89,6 +95,11 @@ export default Component.extend({ if (!this.paramsHash) { this.set('paramsHash', {purpose: 'image'}); } + + this.set('imageExtensions', IMAGE_EXTENSIONS); + this.set('imageMimeTypes', IMAGE_MIME_TYPES); + this.set('iconExtensions', ICON_EXTENSIONS); + this.set('iconMimeTypes', ICON_MIME_TYPES); }, didReceiveAttrs() { @@ -105,6 +116,20 @@ export default Component.extend({ }, actions: { + registerFileInput(input) { + this.fileInput = input; + }, + + triggerFileDialog() { + if (!this.fileInput) { + // eslint-disable-next-line + console.error('When using uploader.triggerFileDialog you must call uploader.registerFileInput first'); + return; + } + + this.fileInput.click(); + }, + setFiles(files, resetInput) { this._setFiles(files); diff --git a/app/components/modal-email-design-settings-labs.hbs b/app/components/modal-email-design-settings-labs.hbs new file mode 100644 index 0000000000..af92b50205 --- /dev/null +++ b/app/components/modal-email-design-settings-labs.hbs @@ -0,0 +1,300 @@ + \ No newline at end of file diff --git a/app/components/modal-email-design-settings-labs.js b/app/components/modal-email-design-settings-labs.js new file mode 100644 index 0000000000..77e5f46fee --- /dev/null +++ b/app/components/modal-email-design-settings-labs.js @@ -0,0 +1,92 @@ +import ModalComponent from 'ghost-admin/components/modal-base'; +import moment from 'moment'; +// TODO: expose this via a helper +import {IMAGE_EXTENSIONS} from 'ghost-admin/components/gh-image-uploader'; +import {action} from '@ember/object'; +import {htmlSafe} from '@ember/template'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; + +export default class ModalEmailDesignSettings extends ModalComponent { + @service config; + @service ghostPaths; + @service session; + @service settings; + + @tracked headerImage = this.settings.get('newsletterHeaderImage'); + @tracked showHeaderIcon = this.settings.get('newsletterShowHeaderIcon'); + @tracked showHeaderTitle = this.settings.get('newsletterShowHeaderTitle'); + @tracked titleFontCategory = this.settings.get('newsletterTitleFontCategory'); + @tracked titleAlignment = this.settings.get('newsletterTitleAlignment'); + @tracked showFeatureImage = this.settings.get('newsletterShowFeatureImage'); + @tracked bodyFontCategory = this.settings.get('newsletterBodyFontCategory'); + @tracked footerContent = this.settings.get('newsletterFooterContent'); + @tracked showBadge = this.settings.get('newsletterShowBadge'); + + currentDate = moment().format('D MMM YYYY'); + imageExtensions = IMAGE_EXTENSIONS; + + get showHeader() { + return (this.showHeaderIcon && this.settings.get('icon')) || this.showHeaderTitle; + } + + get featureImageUrl() { + // keep path separate so asset rewriting correctly picks it up + let imagePath = '/img/user-cover.png'; + let fullPath = this.ghostPaths.assetRoot.replace(/\/$/, '') + imagePath; + return fullPath; + } + + get featureImageStyle() { + return htmlSafe(`background-image: url(http://github.com/$%7Bthis.featureImageUrl%7D)`); + } + + @action + toggleSetting(setting, event) { + this[setting] = event.target.checked; + } + + @action + changeSetting(setting, value) { + this[setting] = value; + } + + @action + imageUploaded(setting, images) { + if (images[0]) { + this[setting] = images[0].url; + } + } + + @action + handleInputFocus() { + this._removeShortcuts(); + } + + @action + handleInputBlur() { + this._setupShortcuts(); + } + + @action + confirm() { + this.saveSettings.perform(); + } + + @task({drop: true}) + *saveSettings() { + this.settings.set('newsletterHeaderImage', this.headerImage); + this.settings.set('newsletterShowHeaderIcon', this.showHeaderIcon); + this.settings.set('newsletterShowHeaderTitle', this.showHeaderTitle); + this.settings.set('newsletterTitleFontCategory', this.titleFontCategory); + this.settings.set('newsletterTitleAlignment', this.titleAlignment); + this.settings.set('newsletterShowFeatureImage', this.showFeatureImage); + this.settings.set('newsletterBodyFontCategory', this.bodyFontCategory); + this.settings.set('newsletterFooterContent', this.footerContent); + this.settings.set('newsletterShowBadge', this.showBadge); + + yield this.settings.save(); + this.closeModal(); + } +} diff --git a/app/components/modal-email-design-settings.hbs b/app/components/modal-email-design-settings.hbs index 40316da058..efa315f904 100644 --- a/app/components/modal-email-design-settings.hbs +++ b/app/components/modal-email-design-settings.hbs @@ -145,7 +145,7 @@

    Your email newsletter

    - By {{if this.session.user.name this.session.user.name this.session.user.email}} – {{this.currentDate}} –  View online → + By {{if this.session.user.name this.session.user.name this.session.user.email}} – {{this.currentDate}} – View online →

    diff --git a/app/models/setting.js b/app/models/setting.js index 0fe9cc2dfd..1418aa9818 100644 --- a/app/models/setting.js +++ b/app/models/setting.js @@ -77,9 +77,15 @@ export default Model.extend(ValidationEngine, { * Newsletter settings */ newsletterShowHeader: attr('boolean'), + newsletterHeaderImage: attr('string'), + newsletterShowHeaderIcon: attr('boolean'), + newsletterShowHeaderTitle: attr('boolean'), + newsletterTitleFontCategory: attr('string'), + newsletterTitleAlignment: attr('string'), + newsletterShowFeatureImage: attr('boolean'), newsletterBodyFontCategory: attr('string'), - newsletterShowBadge: attr('boolean'), newsletterFooterContent: attr('string'), + newsletterShowBadge: attr('boolean'), /** * OAuth settings */ diff --git a/app/styles/components/modals.css b/app/styles/components/modals.css index c3319e39e3..746614d62e 100644 --- a/app/styles/components/modals.css +++ b/app/styles/components/modals.css @@ -227,7 +227,7 @@ } -/* Full screen setting modal with preview. Used in e.g. Portal +/* Full screen setting modal with preview. Used in e.g. Portal /* settings, Email design settings etc. /* ---------------------------------------------------------- */ .modal-fullsettings { @@ -241,6 +241,9 @@ padding: 0; flex-grow: 1; } +.labs-newsletter-settings .modal-fullsettings-body { + overflow: hidden; +} .modal-fullsettings-body .form-group.space-l { margin-bottom: 1.9em; @@ -266,6 +269,10 @@ padding: 0px 24px 20px; width: 362px; } +.labs-newsletter-settings .modal-fullsettings-sidebar { + width: 400px; + overflow-y: auto; +} .modal-fullsettings-sidebar.with-footer { justify-content: space-between; @@ -275,6 +282,9 @@ height: 66px; padding: 0 24px; } +.labs-newsletter-settings .modal-fullsettings-topbar { + border-bottom: 1px solid var(--whitegrey); +} .modal-fullsettings-heading { display: flex; @@ -284,6 +294,9 @@ padding: 0 24px; margin: 0 -24px 1px; } +.labs-newsletter-settings .modal-fullsettings-heading { + height: 66px; +} .modal-fullsettings-form { min-width: 292px; @@ -294,14 +307,22 @@ padding: 0 24px; } +/* labs-newsletter-settings - delete all when removing flag */ .modal-fullsettings-section.first { margin-top: 8px; } +.labs-newsletter-settings .modal-fullsettings-section.first { + margin-top: 24px; +} +/* end delete all */ .modal-fullsettings-section.divider-top { border-top: 1px solid var(--whitegrey); padding-top: 16px; } +.labs-newsletter-settings .modal-fullsettings-section.divider-top { + padding-top: 24px; +} .modal-fullsettings-sectionheading { font-size: 1.2rem; @@ -319,6 +340,9 @@ padding: 0; margin-bottom: 0; } +.labs-newsletter-settings .modal-fullsettings-section .form-group { + margin-bottom: 20px; +} .modal-fullsettings-section .form-group > p { font-size: 1.25rem !important; @@ -365,6 +389,99 @@ margin: 0 12px 0 0; } +.labs-newsletter-settings .modal-fullsettings-uploader { + display: flex; + align-items: center; + margin: 18px 0 0; + padding: 3px; + border: 1px solid var(--whitegrey); + border-radius: 3px; +} + +.labs-newsletter-settings .gh-header-img-uploadicon, +.labs-newsletter-settings .gh-header-img-uploadicon:hover, +.labs-newsletter-settings .gh-header-img-uploadicon:focus { + width: 56px; + height: 44px; + margin-right: 11px; + border: 1px dashed var(--lightgrey); + background: transparent; + box-shadow: none; +} + +.labs-newsletter-settings .gh-header-img-uploadicon span { + display: flex; + justify-content: center; + align-items: center; +} + +.labs-newsletter-settings .gh-header-img-uploadicon span svg { + width: 18px; + height: 18px; + fill: var(--darkgrey); +} + +.labs-newsletter-settings .gh-header-img-uploadicon:hover span svg { + fill: var(--darkgrey); +} + +.labs-newsletter-settings .gh-header-img-container { + height: 44px; +} + +.labs-newsletter-settings .gh-header-img-thumbnail { + display: inline-block; + width: 56px; + height: 44px; + margin: 0 11px 0 0; + border: 1px solid var(--whitegrey); + cursor: pointer; + background-position: center; + object-fit: cover; + border-radius: 3px; +} + +.labs-newsletter-settings .gh-header-img-thumbnail svg path { + stroke: var(--midlightgrey-d1); +} + +.labs-newsletter-settings .gh-header-img-deleteicon { + position: absolute; + left: 4px; + width: 56px; + height: 44px; + background: var(--black) !important; + opacity: 0; +} + +.labs-newsletter-settings .gh-header-img-deleteicon:hover { + opacity: 1; +} + +.labs-newsletter-settings .gh-header-img-deleteicon span { + display: flex; + justify-content: center; + align-items: center; +} + +.labs-newsletter-settings .gh-header-img-deleteicon span svg { + width: 18px; + height: 18px; +} + +.modal-fullsettings-uploader h4 { + margin: 0 !important; + padding: 0; + font-size: 1.3rem; + line-height: 1.4em; +} + +.modal-fullsettings-uploader p { + margin: 0 !important; + padding: 0; + font-size: 1.2rem !important; +} + .modal-fullsettings-main { display: flex; flex-direction: column; @@ -379,6 +496,9 @@ height: calc(100vh - 126px); overflow-y: scroll; } +.labs-newsletter-settings .modal-fullsettings-preview-container { + height: 100vh; +} .modal-fullsettings-preview-hidescrollbar { overflow: hidden; @@ -387,6 +507,9 @@ border: 1px solid var(--whitegrey); border-radius: 5px; } +.labs-newsletter-settings .modal-fullsettings-preview-hidescrollbar { + height: 100vh; +} .modal-fullsettings-preview-hidescrollbar .modal-fullsettings-preview-container { border: none; @@ -448,4 +571,4 @@ flex: 1; margin-right: 10px; } -} \ No newline at end of file +} diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index 6af0cf627c..b653f2b902 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -58,7 +58,7 @@ @media (max-width: 1100px) { .members-list { - border-bottom: none + border-bottom: none } } @@ -780,7 +780,7 @@ textarea.gh-member-details-textarea { } .gh-member-btn-expandfeed { - margin: 8px 0; + margin: 8px 0; } @@ -1180,6 +1180,13 @@ p.gh-members-import-errordetail:first-of-type { /* Email newsletter design settings /* -------------------------------------------------------- */ +.labs-newsletter-settings .gh-email-design-alignment { + display: flex; + justify-content: space-between; + align-items: center; + margin: -4px 0 0 0; +} + .gh-email-design-typography .gh-radio { display: flex; align-items: center; @@ -1188,18 +1195,44 @@ p.gh-members-import-errordetail:first-of-type { padding: 0; margin-bottom: 12px; } +.labs-newsletter-settings .gh-email-design-typography .gh-radio { + margin-bottom: 2px; +} .gh-email-design-typography .gh-radio-content { border: 1px solid var(--whitegrey); - border-radius: 3px; + border-radius: 3px; /* labs-newsletter-settings - delete line when removing flag */ margin: 0 -32px 0 0; } +/* labs-newsletter-settings - delete all when removing flag */ +.labs-newsletter-settings .gh-email-design-typography .gh-radio-content { + border-radius: inherit; +} +/* end delete all */ + +.labs-newsletter-settings .gh-email-design-typography .gh-radio-content.serif { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.labs-newsletter-settings .gh-email-design-typography .gh-radio-content.sans-serif { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +.labs-newsletter-settings .gh-email-design-typography .active { + margin: 0 2px 2px; +} .gh-email-design-typography .active .gh-radio-content { border: 1px solid transparent; box-shadow: 0px 0px 0px 2px var(--green); } +.labs-newsletter-settings .gh-email-design-typography .active .gh-radio-label { + margin: 0 -2px; +} + .gh-email-design-typography .gh-radio-button { margin-right: 12px; opacity: 0; @@ -1219,6 +1252,13 @@ p.gh-members-import-errordetail:first-of-type { width: 44px; text-align: center; } +.labs-newsletter-settings .gh-email-design-typography .gh-radio-label .sample { + font-weight: 400; +} + +.labs-newsletter-settings .gh-email-design-typography .gh-radio-label .sample.title { + font-weight: 600; +} .gh-email-design-typography .gh-radio-label .description h4 { font-size: 1.3rem; @@ -1227,7 +1267,8 @@ p.gh-members-import-errordetail:first-of-type { line-height: 1.4em; } -.gh-email-design-typography .gh-radio-label.serif .description h4 { +.gh-email-design-typography .gh-radio-label.serif .description h4, +.labs-newsletter-settings .gh-email-design-typography .gh-radio-content.serif .description h4 { font-family: Georgia, 'Times New Roman', Times, serif; font-size: 1.3rem; } @@ -1238,7 +1279,8 @@ p.gh-members-import-errordetail:first-of-type { padding: 0; } -.gh-email-design-typography .gh-radio-label.serif .description p { +.gh-email-design-typography .gh-radio-label.serif .description p, +.labs-newsletter-settings .gh-email-design-typography .gh-radio-content.serif .description p { font-size: 1.25rem !important; margin: 0; padding: 0; @@ -1253,7 +1295,7 @@ p.gh-members-import-errordetail:first-of-type { .gh-members-emailsettings-footer-input p { height: 108px; - overflow-y: scroll; + overflow-y: auto; } .gh-members-emailsettings-footer-input p { @@ -1266,6 +1308,10 @@ p.gh-members-import-errordetail:first-of-type { padding-top: 20px; margin-bottom: 4px; } +.labs-newsletter-settings .gh-members-emailsettings-footer { + padding: inherit; + margin: 0px -24px 4px; +} .gh-members-emailsettings-footer .form-group { align-items: flex-start; @@ -1406,6 +1452,9 @@ p.gh-members-import-errordetail:first-of-type { align-items: center; padding: 50px 0 40px; } +.labs-newsletter-settings .gh-members-emailpreview-title-left { + align-items: flex-start; +} .gh-members-emailpreview-title h2 { font-size: 4.2rem; @@ -1438,6 +1487,15 @@ p.gh-members-import-errordetail:first-of-type { color: #15212A; } +.labs-newsletter-settings .gh-members-emailpreview-featureimage { + width: 100%; + max-width: 600px; + height: 300px; + margin-bottom: 1.7em; + background: #fafafa no-repeat 50%; + background-size: cover; +} + .gh-members-emailpreview-content { padding-bottom: 20px; border-bottom: 1px solid #e5eff5; @@ -1713,4 +1771,4 @@ p.gh-members-import-errordetail:first-of-type { .gh-member-product-form-block .form-group:last-of-type { margin: 0; -} \ No newline at end of file +} diff --git a/app/styles/patterns/buttons.css b/app/styles/patterns/buttons.css index 46bd6ee805..b5bd86d1d8 100644 --- a/app/styles/patterns/buttons.css +++ b/app/styles/patterns/buttons.css @@ -421,7 +421,7 @@ Usage: CTA buttons grouped together horizontally. border-radius: 0; height: 30px; line-height: 30px; - border-radius: 2px; + border-radius: 3px; background: transparent !important; font-weight: 500 !important; } @@ -438,6 +438,31 @@ Usage: CTA buttons grouped together horizontally. fill: var(--black); } +.gh-btn-group.icons .gh-btn { + margin: 3px; + border-radius: 3px; +} + +.gh-btn-group.icons .gh-btn span { + height: 28px; + padding: 0 10px; +} + +.gh-btn-group.icons .gh-btn-icon svg { + width: 18px; + height: 18px; + margin-right: 0; + fill: var(--midgrey); +} + +.gh-btn-group.icons .gh-btn-group-selected svg { + fill: var(--black); +} + +.gh-btn-group.icons .gh-btn-icon svg path { + stroke: none; +} + .gh-btn-block + .gh-btn-block { margin-top: 5px; } diff --git a/app/templates/settings/members-email.hbs b/app/templates/settings/members-email.hbs index 4fae94dae1..f65934b791 100644 --- a/app/templates/settings/members-email.hbs +++ b/app/templates/settings/members-email.hbs @@ -45,8 +45,14 @@ {{#if this.showEmailDesignSettings}} - + {{#if (enable-developer-experiments)}} + + {{else}} + + {{/if}} {{/if}} \ No newline at end of file diff --git a/public/assets/icons/align-center.svg b/public/assets/icons/align-center.svg new file mode 100644 index 0000000000..7016d3625d --- /dev/null +++ b/public/assets/icons/align-center.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/icons/align-left.svg b/public/assets/icons/align-left.svg new file mode 100644 index 0000000000..3254e64c79 --- /dev/null +++ b/public/assets/icons/align-left.svg @@ -0,0 +1,3 @@ + + + From 949ede93d14ddf07ce39ac52f86f63a4f5aadb2b Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 7 Jun 2021 22:03:04 +0530 Subject: [PATCH 0435/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20missing=20comp?= =?UTF-8?q?limentary=20subscription=20add=20button?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Ghost/commit/81de2fe223e47255899523a113b63b1423c2de14 refs https://github.com/TryGhost/Team/issues/758 The "Add complimentary" subscription button in members does not show up when members already have an existing zero amount subscription. But this was incorrectly not taking into account active subscriptions and was applying the rule to canceled subscriptions. Since the `comped` behaviour changed in 4.6 which caused member's existing comp subscription to be canceled, this bug did not allow the comped subscription to be added back. --- app/components/gh-member-settings-form-cp.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/components/gh-member-settings-form-cp.js b/app/components/gh-member-settings-form-cp.js index 182493f23d..0d76de7afd 100644 --- a/app/components/gh-member-settings-form-cp.js +++ b/app/components/gh-member-settings-form-cp.js @@ -31,7 +31,9 @@ export default class extends Component { get isAddComplimentaryAllowed() { let subscriptions = this.member.get('subscriptions') || []; - const hasZeroPriceSub = subscriptions.find((sub) => { + const hasZeroPriceSub = subscriptions.filter((sub) => { + return ['active', 'trialing', 'unpaid', 'past_due'].includes(sub.status); + }).find((sub) => { return !sub?.price?.amount; }); return !hasZeroPriceSub; From 1301c5bb87b31951ac6a4f04adcf9ad185be11b7 Mon Sep 17 00:00:00 2001 From: Sam Lord Date: Mon, 7 Jun 2021 17:59:44 +0100 Subject: [PATCH 0436/3032] v4.6.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c12bc057f..5473ef8f27 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "4.6.5", + "version": "4.6.6", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org/", From bd57f43ebec2d0aa51536d59037f1b18ef764ee1 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 7 Jun 2021 18:52:37 +0100 Subject: [PATCH 0437/3032] Switched newsletter body/title font selectors to dropdowns refs https://github.com/TryGhost/Team/issues/755 - added new `` component that wraps PowerSelect to create a quick option for offering a serif/sans-serif dropdown - replaced radio buttons in labs email customisation modal with the new font selector --- app/components/gh-font-selector.hbs | 18 +++++ app/components/gh-font-selector.js | 25 +++++++ .../modal-email-design-settings-labs.hbs | 66 +++---------------- 3 files changed, 51 insertions(+), 58 deletions(-) create mode 100644 app/components/gh-font-selector.hbs create mode 100644 app/components/gh-font-selector.js diff --git a/app/components/gh-font-selector.hbs b/app/components/gh-font-selector.hbs new file mode 100644 index 0000000000..1d24030f56 --- /dev/null +++ b/app/components/gh-font-selector.hbs @@ -0,0 +1,18 @@ + +
    + Aa +
    +

    {{option.name}}

    +

    {{option.description}}

    +
    +
    +
    \ No newline at end of file diff --git a/app/components/gh-font-selector.js b/app/components/gh-font-selector.js new file mode 100644 index 0000000000..d79fe617fa --- /dev/null +++ b/app/components/gh-font-selector.js @@ -0,0 +1,25 @@ +import Component from '@glimmer/component'; +import {action} from '@ember/object'; + +export default class GhFontSelector extends Component { + get options() { + return [{ + name: 'Elegant serif', + description: 'All site visitors to your site, no login required', + value: 'serif' + }, { + name: 'Clean sans-serif', + description: 'A more minimal style with sharp lines', + value: 'sans_serif' + }]; + } + + get selectedOption() { + return this.options.find(o => o.value === this.args.selected); + } + + @action + selectOption(option) { + this.args.onChange(option.value); + } +} diff --git a/app/components/modal-email-design-settings-labs.hbs b/app/components/modal-email-design-settings-labs.hbs index af92b50205..ba30862085 100644 --- a/app/components/modal-email-design-settings-labs.hbs +++ b/app/components/modal-email-design-settings-labs.hbs @@ -131,72 +131,22 @@

    - {{!--

    Font style for the email title

    --}}
    +
    +
    - {{#if (enable-developer-experiments)}} -
    -
    -
    -

    Google OAuth for staff users

    -

    - Allow people to sign into Ghost Admin using Google SSO, - {{!-- TODO: create an help desk article and update the url here --}} - docs here -

    -
    -
    - -
    -
    -
    - {{#if this.isOAuthEnabled}} -
    - {{svg-jar "google-favicon"}}Configure Google OAuth - -
    - - -
    -
    - - -
    -
    -
    - {{/if}} + {{#if (enable-developer-experiments)}} +
    +

    Alpha Features

    +
    +
    +
    +
    +

    Google OAuth for staff users

    +

    + Allow people to sign into Ghost Admin using Google SSO, + {{!-- TODO: create an help desk article and update the url here --}} + docs here +

    +
    +
    +
    - {{/if}} +
    + {{#if this.isOAuthEnabled}} +
    + {{svg-jar "google-favicon"}}Configure Google OAuth + +
    + + +
    + +
    + + +
    +
    +
    + {{/if}} +
    +
    + {{/if}} From 980544234cdf52107af38cea05120cd1abcd861d Mon Sep 17 00:00:00 2001 From: Hannah Wolfe Date: Mon, 7 Jun 2021 20:07:45 +0100 Subject: [PATCH 0439/3032] Added UI for match helper labs flag - Ensure the feature flag is available in the feature service so that it knows where to pull the setting from (labs) - Added a toggle UI to the alpha features list in labs as this is a new feature and is therefore alpha - Changed the old gh-feature-flag helper to use the switch class instead of checkbox as that's a new pattern since we used this helper --- app/components/gh-feature-flag.js | 2 +- app/services/feature.js | 1 + app/templates/settings/labs.hbs | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/components/gh-feature-flag.js b/app/components/gh-feature-flag.js index a4c48b9d2b..15c5d5e402 100644 --- a/app/components/gh-feature-flag.js +++ b/app/components/gh-feature-flag.js @@ -7,7 +7,7 @@ const FeatureFlagComponent = Component.extend({ feature: service(), tagName: 'label', - classNames: 'checkbox', + classNames: 'switch', attributeBindings: ['for', 'disabled'], disabled: computed('_disabled', function () { if (this._disabled) { diff --git a/app/services/feature.js b/app/services/feature.js index 8b7ff2fd93..caed2fa79d 100644 --- a/app/services/feature.js +++ b/app/services/feature.js @@ -53,6 +53,7 @@ export default Service.extend({ emailAnalytics: feature('emailAnalytics'), nightShift: feature('nightShift', {user: true, onChange: '_setAdminTheme'}), launchComplete: feature('launchComplete', {user: true}), + matchHelper: feature('matchHelper'), _user: null, diff --git a/app/templates/settings/labs.hbs b/app/templates/settings/labs.hbs index 891bc0fd8f..27630900e3 100644 --- a/app/templates/settings/labs.hbs +++ b/app/templates/settings/labs.hbs @@ -241,6 +241,19 @@ {{/if}}
    +
    +
    +
    +

    Match helper

    +

    + Experimental \{{match}} helper for themes. +

    +
    +
    + +
    +
    +
    {{/if}} From 35705b088cb59efaaef6f4a7a7a10586290292e6 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Mon, 7 Jun 2021 23:05:53 +0200 Subject: [PATCH 0440/3032] Updated email font selector dropdowns --- app/components/gh-font-selector.js | 2 +- .../modal-email-design-settings-labs.hbs | 2 +- app/styles/components/modals.css | 14 +++++++++++--- app/styles/layouts/members.css | 15 +++++++-------- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/app/components/gh-font-selector.js b/app/components/gh-font-selector.js index d79fe617fa..93999d6c3c 100644 --- a/app/components/gh-font-selector.js +++ b/app/components/gh-font-selector.js @@ -5,7 +5,7 @@ export default class GhFontSelector extends Component { get options() { return [{ name: 'Elegant serif', - description: 'All site visitors to your site, no login required', + description: 'Beautiful lines with great readability', value: 'serif' }, { name: 'Clean sans-serif', diff --git a/app/components/modal-email-design-settings-labs.hbs b/app/components/modal-email-design-settings-labs.hbs index ba30862085..2b7cd7dd08 100644 --- a/app/components/modal-email-design-settings-labs.hbs +++ b/app/components/modal-email-design-settings-labs.hbs @@ -66,7 +66,7 @@ data-test-file-input="icon" />
    {{/if}} -
    +

    An optional branded image

    For best result use 1200x600 PNG image

    diff --git a/app/styles/components/modals.css b/app/styles/components/modals.css index 746614d62e..a28560a914 100644 --- a/app/styles/components/modals.css +++ b/app/styles/components/modals.css @@ -370,6 +370,10 @@ margin: 18px 0 0; } +.labs-newsletter-settings .modal-fullsettings-radiogroup { + margin: 0; +} + .modal-fullsettings-radiogroup .gh-radio { margin-bottom: 14px; } @@ -393,8 +397,8 @@ display: flex; align-items: center; margin: 18px 0 0; - padding: 3px; - border: 1px solid var(--whitegrey); + padding: 4px; + border: 1px solid var(--whitegrey-d1); border-radius: 3px; } @@ -402,7 +406,7 @@ .labs-newsletter-settings .gh-header-img-uploadicon:hover, .labs-newsletter-settings .gh-header-img-uploadicon:focus { width: 56px; - height: 44px; + height: 50px; margin-right: 11px; border: 1px dashed var(--lightgrey); background: transparent; @@ -469,6 +473,10 @@ height: 18px; } +.labs-newsletter-setings .gh-header-img-desc { + padding: 6px 0; +} + .modal-fullsettings-uploader h4 { margin: 0 !important; padding: 0; diff --git a/app/styles/layouts/members.css b/app/styles/layouts/members.css index b653f2b902..d82ad86e6a 100644 --- a/app/styles/layouts/members.css +++ b/app/styles/layouts/members.css @@ -1244,6 +1244,12 @@ p.gh-members-import-errordetail:first-of-type { align-items: center; } +.labs-newsletter-settings .gh-email-design-typography .gh-radio-label { + padding: 12px 8px; + display: flex; + align-items: center; +} + .gh-email-design-typography .gh-radio-label .sample { display: block; font-size: 3.2rem; @@ -1252,13 +1258,6 @@ p.gh-members-import-errordetail:first-of-type { width: 44px; text-align: center; } -.labs-newsletter-settings .gh-email-design-typography .gh-radio-label .sample { - font-weight: 400; -} - -.labs-newsletter-settings .gh-email-design-typography .gh-radio-label .sample.title { - font-weight: 600; -} .gh-email-design-typography .gh-radio-label .description h4 { font-size: 1.3rem; @@ -1287,7 +1286,7 @@ p.gh-members-import-errordetail:first-of-type { } .gh-members-emailsettings-footer-input { - border: 1px solid var(--whitegrey); + border: 1px solid var(--whitegrey-d1); padding: 0 12px 6px 12px; height: 120px; border-radius: 4px; From 55ef8c01385dffa2d79222316979ced3d938d6a7 Mon Sep 17 00:00:00 2001 From: Sanne de Vries Date: Tue, 8 Jun 2021 09:38:38 +0200 Subject: [PATCH 0441/3032] Updated header img uploader and disabled states in email design settings --- app/components/modal-email-design-settings-labs.hbs | 2 +- app/styles/components/modals.css | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/components/modal-email-design-settings-labs.hbs b/app/components/modal-email-design-settings-labs.hbs index 2b7cd7dd08..dc13f50265 100644 --- a/app/components/modal-email-design-settings-labs.hbs +++ b/app/components/modal-email-design-settings-labs.hbs @@ -75,7 +75,7 @@ - +
    - +
    From 1d64f7d8a26ae1887d0c1a666fc5b7967d4f5758 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 8 Jun 2021 12:27:30 +0100 Subject: [PATCH 0444/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20member=20count?= =?UTF-8?q?=20in=20publish=20menu=20not=20matching=20subscription=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit no issue - the `subscribed:true` filter was missed in the member count queries when we switched from `` to `` (https://github.com/TryGhost/Admin/pull/1972) --- app/components/gh-members-recipient-select.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/gh-members-recipient-select.js b/app/components/gh-members-recipient-select.js index 638cd2ef55..363276ffa8 100644 --- a/app/components/gh-members-recipient-select.js +++ b/app/components/gh-members-recipient-select.js @@ -157,10 +157,10 @@ export default class GhMembersRecipientSelect extends Component { } yield Promise.all([ - this.store.query('member', {filter: 'status:free', limit: 1}).then((res) => { + this.store.query('member', {filter: 'subscribed:true,status:free', limit: 1}).then((res) => { this.freeMemberCount = res.meta.pagination.total; }), - this.store.query('member', {filter: 'status:-free', limit: 1}).then((res) => { + this.store.query('member', {filter: 'subscribed:true,status:-free', limit: 1}).then((res) => { this.paidMemberCount = res.meta.pagination.total; }) ]); From 4ac74f9abe85268e553f62f60fb24cb788af0f92 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 8 Jun 2021 13:07:16 +0100 Subject: [PATCH 0445/3032] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20member=20count?= =?UTF-8?q?=20not=20showing=20in=20send=20email=20confirmation=20modal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://github.com/TryGhost/Team/issues/738 refs https://github.com/TryGhost/Admin/pull/1972 - when we switched from the segment select back to checkboxes and label select we lost the automatic member counting which meant other parts of the publishing workflow had no counts - fixed subscribed status counts shown in publish menu - added the async count back to the confirm modal, taking full free/paid/specific query into account - added total subscribed member count back to the draft publish menu so the email options can be disabled when no subscribed members exist - fixed missing disabled styling inside `` --- .../gh-members-recipient-select.hbs | 6 +++--- app/components/gh-members-recipient-select.js | 4 ++-- app/components/gh-publishmenu-draft.hbs | 3 ++- app/components/gh-publishmenu-draft.js | 21 +++++++++++++++---- app/components/gh-publishmenu.hbs | 2 -- app/components/modal-confirm-email-send.hbs | 14 ++++++------- app/components/modal-confirm-email-send.js | 19 +++++++---------- 7 files changed, 39 insertions(+), 30 deletions(-) diff --git a/app/components/gh-members-recipient-select.hbs b/app/components/gh-members-recipient-select.hbs index 12f9fa1b7a..fdc75c44d8 100644 --- a/app/components/gh-members-recipient-select.hbs +++ b/app/components/gh-members-recipient-select.hbs @@ -1,6 +1,6 @@

    Free members {{this.freeMemberCountLabel}}

    -
    +