ghost 5.18.0 → 5.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +1 -1
  2. package/components/tryghost-adapter-manager-5.19.1.tgz +0 -0
  3. package/components/tryghost-api-framework-5.19.1.tgz +0 -0
  4. package/components/tryghost-api-version-compatibility-service-5.19.1.tgz +0 -0
  5. package/components/tryghost-audience-feedback-5.19.1.tgz +0 -0
  6. package/components/tryghost-bootstrap-socket-5.19.1.tgz +0 -0
  7. package/components/tryghost-constants-5.19.1.tgz +0 -0
  8. package/components/tryghost-custom-theme-settings-service-5.19.1.tgz +0 -0
  9. package/components/tryghost-domain-events-5.19.1.tgz +0 -0
  10. package/components/tryghost-email-analytics-provider-mailgun-5.19.1.tgz +0 -0
  11. package/components/tryghost-email-analytics-service-5.19.1.tgz +0 -0
  12. package/components/tryghost-email-content-generator-5.19.1.tgz +0 -0
  13. package/components/tryghost-express-dynamic-redirects-5.19.1.tgz +0 -0
  14. package/components/tryghost-extract-api-key-5.19.1.tgz +0 -0
  15. package/components/tryghost-html-to-plaintext-5.19.1.tgz +0 -0
  16. package/components/{tryghost-job-manager-5.18.0.tgz → tryghost-job-manager-5.19.1.tgz} +0 -0
  17. package/components/tryghost-link-redirects-5.19.1.tgz +0 -0
  18. package/components/tryghost-link-replacer-5.19.1.tgz +0 -0
  19. package/components/tryghost-link-tracking-5.19.1.tgz +0 -0
  20. package/components/{tryghost-magic-link-5.18.0.tgz → tryghost-magic-link-5.19.1.tgz} +0 -0
  21. package/components/tryghost-mailgun-client-5.19.1.tgz +0 -0
  22. package/components/tryghost-member-analytics-service-5.19.1.tgz +0 -0
  23. package/components/tryghost-member-attribution-5.19.1.tgz +0 -0
  24. package/components/tryghost-member-events-5.19.1.tgz +0 -0
  25. package/components/tryghost-members-analytics-ingress-5.19.1.tgz +0 -0
  26. package/components/tryghost-members-api-5.19.1.tgz +0 -0
  27. package/components/tryghost-members-csv-5.19.1.tgz +0 -0
  28. package/components/tryghost-members-events-service-5.19.1.tgz +0 -0
  29. package/components/tryghost-members-importer-5.19.1.tgz +0 -0
  30. package/components/tryghost-members-offers-5.19.1.tgz +0 -0
  31. package/components/tryghost-members-payments-5.19.1.tgz +0 -0
  32. package/components/tryghost-members-ssr-5.19.1.tgz +0 -0
  33. package/components/tryghost-members-stripe-service-5.19.1.tgz +0 -0
  34. package/components/tryghost-minifier-5.19.1.tgz +0 -0
  35. package/components/tryghost-mw-api-version-mismatch-5.19.1.tgz +0 -0
  36. package/components/tryghost-mw-cache-control-5.19.1.tgz +0 -0
  37. package/components/{tryghost-mw-error-handler-5.18.0.tgz → tryghost-mw-error-handler-5.19.1.tgz} +0 -0
  38. package/components/tryghost-mw-session-from-token-5.19.1.tgz +0 -0
  39. package/components/tryghost-mw-update-user-last-seen-5.19.1.tgz +0 -0
  40. package/components/tryghost-mw-vhost-5.19.1.tgz +0 -0
  41. package/components/tryghost-oembed-service-5.19.1.tgz +0 -0
  42. package/components/tryghost-package-json-5.19.1.tgz +0 -0
  43. package/components/{tryghost-referrers-5.18.0.tgz → tryghost-referrers-5.19.1.tgz} +0 -0
  44. package/components/tryghost-security-5.19.1.tgz +0 -0
  45. package/components/tryghost-session-service-5.19.1.tgz +0 -0
  46. package/components/tryghost-settings-path-manager-5.19.1.tgz +0 -0
  47. package/components/tryghost-staff-service-5.19.1.tgz +0 -0
  48. package/components/tryghost-stats-service-5.19.1.tgz +0 -0
  49. package/components/tryghost-update-check-service-5.19.1.tgz +0 -0
  50. package/components/tryghost-verification-trigger-5.19.1.tgz +0 -0
  51. package/components/tryghost-version-notifications-data-service-5.19.1.tgz +0 -0
  52. package/core/boot.js +3 -1
  53. package/core/built/admin/assets/{chunk.143.6d23a3157dae7a9c899d.js → chunk.143.af6972210ca7d2bfdcff.js} +6 -6
  54. package/core/built/admin/assets/{chunk.174.e997dfffceeaa0ce4636.js → chunk.174.3a133d51d9b45097c101.js} +31 -31
  55. package/core/built/admin/assets/{chunk.178.52a9ca26217a593eda67.js → chunk.178.6f68a314b66338b41c62.js} +4 -4
  56. package/core/built/admin/assets/{chunk.427.4483d5bbdaf2a65888ac.js → chunk.613.f1d519ad47e7f9024263.js} +40 -47
  57. package/core/built/admin/assets/{chunk.427.4483d5bbdaf2a65888ac.js.LICENSE.txt → chunk.613.f1d519ad47e7f9024263.js.LICENSE.txt} +0 -0
  58. package/core/built/admin/assets/{ghost-7e6e9479705e7e772bb5ea3b6476cd52.js → ghost-5ce6f5a730c83c91fc258b12c537ea35.js} +555 -559
  59. package/core/built/admin/assets/{ghost-ff0bee94743aa886ce35305a5b46fac3.css → ghost-982146a4ada3a5af1981d1919ae01d08.css} +1 -1
  60. package/core/built/admin/assets/{ghost-dark-a41f7645a406e0df78b7152f3f805e66.css → ghost-dark-41929e4857de411a23597a9de49a4e4f.css} +1 -1
  61. package/core/built/admin/assets/{vendor-4da5d2584fbe1442e25e4271a5513f1c.js → vendor-5c7d7063620bec13668c4370145cd4b4.js} +41 -34
  62. package/core/built/admin/index.html +6 -6
  63. package/core/frontend/helpers/t.js +12 -0
  64. package/core/frontend/helpers/tpl/content-cta.hbs +1 -1
  65. package/core/frontend/public/robots.txt +1 -0
  66. package/core/frontend/services/sitemap/handler.js +1 -1
  67. package/core/frontend/services/sitemap/index-generator.js +1 -3
  68. package/core/frontend/src/comment-counts/js/comment-counts.js +8 -0
  69. package/core/server/api/endpoints/feedback-members.js +23 -0
  70. package/core/server/api/endpoints/index.js +5 -1
  71. package/core/server/api/endpoints/utils/serializers/input/posts.js +6 -1
  72. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +8 -0
  73. package/core/server/data/exporter/table-lists.js +3 -1
  74. package/core/server/data/importer/handlers/json.js +21 -23
  75. package/core/server/data/importer/importers/data/base.js +1 -1
  76. package/core/server/data/migrations/versions/4.0/05-add-members-subscribe-events-table.js +1 -1
  77. package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +1 -1
  78. package/core/server/data/migrations/versions/4.0/11-add-members-paid-subscription-events-table.js +1 -1
  79. package/core/server/data/migrations/versions/4.0/13-add-members-payment-events-table.js +1 -1
  80. package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +1 -1
  81. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +1 -1
  82. package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +1 -1
  83. package/core/server/data/migrations/versions/4.11/02-add-email-verification-required-setting.js +1 -1
  84. package/core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js +1 -1
  85. package/core/server/data/migrations/versions/4.3/03-add-default-product.js +1 -1
  86. package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +1 -1
  87. package/core/server/data/migrations/versions/4.3/06-add-stripe-prices-table.js +2 -2
  88. package/core/server/data/migrations/versions/4.3/08-migrate-members-signup-setting.js +1 -1
  89. package/core/server/data/migrations/versions/4.33/2022-01-14-11-51-add-default-free-tier.js +1 -1
  90. package/core/server/data/migrations/versions/4.42/2022-03-21-17-17-add.js +2 -2
  91. package/core/server/data/migrations/versions/4.43/2022-03-28-19-26-recreate-newsletter-table.js +5 -5
  92. package/core/server/data/migrations/versions/4.46/2022-04-13-13-00-add-default-newsletter.js +1 -1
  93. package/core/server/data/migrations/versions/4.46/2022-04-20-08-39-map-subscribers-to-default-newsletter.js +1 -1
  94. package/core/server/data/migrations/versions/4.7/03-add-labs-setting.js +1 -1
  95. package/core/server/data/migrations/versions/4.8/03-add-default-product-portal-products.js +1 -1
  96. package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +1 -1
  97. package/core/server/data/migrations/versions/5.0/2022-05-06-13-22-add-frontend-integration.js +1 -1
  98. package/core/server/data/migrations/versions/5.17/2022-09-29-12-39-add-track-clicks-column-to-emails.js +2 -2
  99. package/core/server/data/migrations/versions/5.19/2022-09-02-20-25-add-columns-to-products-table.js +19 -0
  100. package/core/server/data/migrations/versions/5.19/2022-09-02-20-52-backfill-new-product-columns.js +37 -0
  101. package/core/server/data/migrations/versions/5.19/2022-10-10-06-58-add-subscriptions-table.js +19 -0
  102. package/core/server/data/migrations/versions/5.19/2022-10-10-10-05-add-members-feedback-table.js +10 -0
  103. package/core/server/data/migrations/versions/5.19/2022-10-11-10-38-add-feedback-enabled-column-to-newsletters.js +7 -0
  104. package/core/server/data/schema/commands.js +3 -3
  105. package/core/server/data/schema/fixtures/fixtures.json +4 -1
  106. package/core/server/data/schema/schema.js +90 -24
  107. package/core/server/data/schema/validator.js +1 -1
  108. package/core/server/models/base/bookshelf.js +3 -4
  109. package/core/server/models/base/plugins/data-manipulation.js +1 -1
  110. package/core/server/models/base/plugins/events.js +1 -1
  111. package/core/server/models/base/utils.js +1 -1
  112. package/core/server/models/member-feedback.js +22 -0
  113. package/core/server/models/newsletter.js +3 -2
  114. package/core/server/models/post.js +24 -0
  115. package/core/server/models/settings.js +1 -1
  116. package/core/server/models/user.js +1 -1
  117. package/core/server/services/audience-feedback/FeedbackRepository.js +67 -0
  118. package/core/server/services/audience-feedback/index.js +33 -0
  119. package/core/server/services/bulk-email/bulk-email-processor.js +7 -1
  120. package/core/server/services/mail/GhostMailer.js +17 -1
  121. package/core/server/services/mega/feedback-buttons.js +69 -0
  122. package/core/server/services/mega/mega.js +1 -1
  123. package/core/server/services/mega/post-email-serializer.js +24 -4
  124. package/core/server/services/mega/template.js +3 -0
  125. package/core/server/services/members/middleware.js +40 -0
  126. package/core/server/services/notifications/notifications.js +1 -1
  127. package/core/server/services/settings/settings-service.js +1 -1
  128. package/core/server/services/themes/storage.js +1 -1
  129. package/core/server/web/members/app.js +12 -0
  130. package/core/shared/labs.js +4 -2
  131. package/package.json +111 -111
  132. package/yarn.lock +585 -498
  133. package/components/tryghost-adapter-manager-5.18.0.tgz +0 -0
  134. package/components/tryghost-api-framework-5.18.0.tgz +0 -0
  135. package/components/tryghost-api-version-compatibility-service-5.18.0.tgz +0 -0
  136. package/components/tryghost-bootstrap-socket-5.18.0.tgz +0 -0
  137. package/components/tryghost-constants-5.18.0.tgz +0 -0
  138. package/components/tryghost-custom-theme-settings-service-5.18.0.tgz +0 -0
  139. package/components/tryghost-domain-events-5.18.0.tgz +0 -0
  140. package/components/tryghost-email-analytics-provider-mailgun-5.18.0.tgz +0 -0
  141. package/components/tryghost-email-analytics-service-5.18.0.tgz +0 -0
  142. package/components/tryghost-email-content-generator-5.18.0.tgz +0 -0
  143. package/components/tryghost-express-dynamic-redirects-5.18.0.tgz +0 -0
  144. package/components/tryghost-extract-api-key-5.18.0.tgz +0 -0
  145. package/components/tryghost-html-to-plaintext-5.18.0.tgz +0 -0
  146. package/components/tryghost-link-redirects-5.18.0.tgz +0 -0
  147. package/components/tryghost-link-replacer-5.18.0.tgz +0 -0
  148. package/components/tryghost-link-tracking-5.18.0.tgz +0 -0
  149. package/components/tryghost-mailgun-client-5.18.0.tgz +0 -0
  150. package/components/tryghost-member-analytics-service-5.18.0.tgz +0 -0
  151. package/components/tryghost-member-attribution-5.18.0.tgz +0 -0
  152. package/components/tryghost-member-events-5.18.0.tgz +0 -0
  153. package/components/tryghost-members-analytics-ingress-5.18.0.tgz +0 -0
  154. package/components/tryghost-members-api-5.18.0.tgz +0 -0
  155. package/components/tryghost-members-csv-5.18.0.tgz +0 -0
  156. package/components/tryghost-members-events-service-5.18.0.tgz +0 -0
  157. package/components/tryghost-members-importer-5.18.0.tgz +0 -0
  158. package/components/tryghost-members-offers-5.18.0.tgz +0 -0
  159. package/components/tryghost-members-payments-5.18.0.tgz +0 -0
  160. package/components/tryghost-members-ssr-5.18.0.tgz +0 -0
  161. package/components/tryghost-members-stripe-service-5.18.0.tgz +0 -0
  162. package/components/tryghost-minifier-5.18.0.tgz +0 -0
  163. package/components/tryghost-mw-api-version-mismatch-5.18.0.tgz +0 -0
  164. package/components/tryghost-mw-cache-control-5.18.0.tgz +0 -0
  165. package/components/tryghost-mw-session-from-token-5.18.0.tgz +0 -0
  166. package/components/tryghost-mw-update-user-last-seen-5.18.0.tgz +0 -0
  167. package/components/tryghost-mw-vhost-5.18.0.tgz +0 -0
  168. package/components/tryghost-oembed-service-5.18.0.tgz +0 -0
  169. package/components/tryghost-package-json-5.18.0.tgz +0 -0
  170. package/components/tryghost-security-5.18.0.tgz +0 -0
  171. package/components/tryghost-session-service-5.18.0.tgz +0 -0
  172. package/components/tryghost-settings-path-manager-5.18.0.tgz +0 -0
  173. package/components/tryghost-staff-service-5.18.0.tgz +0 -0
  174. package/components/tryghost-stats-service-5.18.0.tgz +0 -0
  175. package/components/tryghost-update-check-service-5.18.0.tgz +0 -0
  176. package/components/tryghost-verification-trigger-5.18.0.tgz +0 -0
  177. package/components/tryghost-version-notifications-data-service-5.18.0.tgz +0 -0
@@ -16,11 +16,12 @@ const urlService = require('../../services/url');
16
16
  const linkReplacer = require('@tryghost/link-replacer');
17
17
  const linkTracking = require('../link-tracking');
18
18
  const memberAttribution = require('../member-attribution');
19
+ const feedbackButtons = require('./feedback-buttons');
19
20
 
20
21
  const ALLOWED_REPLACEMENTS = ['first_name', 'uuid'];
21
22
 
22
23
  const PostEmailSerializer = {
23
-
24
+
24
25
  // Format a full html document ready for email by inlining CSS, adjusting links,
25
26
  // and performing any client-specific fixes
26
27
  formatHtmlForEmail(html) {
@@ -107,6 +108,23 @@ const PostEmailSerializer = {
107
108
  return signupUrl.href;
108
109
  },
109
110
 
111
+ /**
112
+ * createUserLinks
113
+ *
114
+ * Generate personalised links for each user
115
+ *
116
+ * @param {string} memberUuid member uuid
117
+ * @param {Object} email
118
+ */
119
+ createUserLinks(email, memberUuid) {
120
+ const result = {...email};
121
+
122
+ result.html = feedbackButtons.generateLinks(result.post.id, memberUuid, result.html);
123
+ result.plaintext = htmlToPlaintext.email(result.html);
124
+
125
+ return result;
126
+ },
127
+
110
128
  // NOTE: serialization is needed to make sure we do post transformations such as image URL transformation from relative to absolute
111
129
  async serializePostModel(model) {
112
130
  // fetch mobiledoc rather than html and plaintext so we can render email-specific contents
@@ -206,6 +224,7 @@ const PostEmailSerializer = {
206
224
  titleAlignment: newsletter.get('title_alignment'),
207
225
  bodyFontCategory: newsletter.get('body_font_category'),
208
226
  showBadge: newsletter.get('show_badge'),
227
+ feedbackEnabled: newsletter.get('feedback_enabled'),
209
228
  footerContent: newsletter.get('footer_content'),
210
229
  showHeaderName: newsletter.get('show_header_name'),
211
230
  accentColor,
@@ -335,7 +354,7 @@ const PostEmailSerializer = {
335
354
  plaintext: post.plaintext
336
355
  };
337
356
 
338
- /**
357
+ /**
339
358
  * If a part of the email is members-only and the post is paid-only, add a paywall:
340
359
  * - Just before sending the email, we'll hide the paywall or paid content depending on the member segment it is sent to.
341
360
  * - We already need to do URL-replacement on the HTML here
@@ -369,7 +388,7 @@ const PostEmailSerializer = {
369
388
 
370
389
  // Add link click tracking
371
390
  url = await linkTracking.service.addTrackingToUrl(url, post, '--uuid--');
372
-
391
+
373
392
  // We need to convert to a string at this point, because we need invalid string characters in the URL
374
393
  const str = url.toString().replace(/--uuid--/g, '%%{uuid}%%');
375
394
  return str;
@@ -490,7 +509,7 @@ const PostEmailSerializer = {
490
509
  });
491
510
 
492
511
  result.html = this.formatHtmlForEmail($.html());
493
- result.plaintext = htmlToPlaintext.email(result.html);
512
+ result.plaintext = htmlToPlaintext.email(result.html);
494
513
  delete result.post;
495
514
 
496
515
  return result;
@@ -501,6 +520,7 @@ module.exports = {
501
520
  serialize: PostEmailSerializer.serialize.bind(PostEmailSerializer),
502
521
  createUnsubscribeUrl: PostEmailSerializer.createUnsubscribeUrl.bind(PostEmailSerializer),
503
522
  createPostSignupUrl: PostEmailSerializer.createPostSignupUrl.bind(PostEmailSerializer),
523
+ createUserLinks: PostEmailSerializer.createUserLinks.bind(PostEmailSerializer),
504
524
  renderEmailForSegment: PostEmailSerializer.renderEmailForSegment.bind(PostEmailSerializer),
505
525
  parseReplacements: PostEmailSerializer.parseReplacements.bind(PostEmailSerializer),
506
526
  // Export for tests
@@ -1,4 +1,5 @@
1
1
  const {escapeHtml: escape} = require('@tryghost/string');
2
+ const feedbackButtons = require('./feedback-buttons');
2
3
 
3
4
  /* eslint indent: warn, no-irregular-whitespace: warn */
4
5
  const iff = (cond, yes, no) => (cond ? yes : no);
@@ -1265,6 +1266,8 @@ ${ templateSettings.showBadge ? `
1265
1266
 
1266
1267
  <!-- END MAIN CONTENT AREA -->
1267
1268
 
1269
+ ${iff(templateSettings.feedbackEnabled, feedbackButtons.getTemplate(templateSettings.accentColor), '')}
1270
+
1268
1271
  <tr>
1269
1272
  <td class="wrapper" align="center">
1270
1273
  <table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top: 40px; padding-bottom: 30px;">
@@ -5,6 +5,13 @@ const models = require('../../models');
5
5
  const urlUtils = require('../../../shared/url-utils');
6
6
  const spamPrevention = require('../../web/shared/middleware/api/spam-prevention');
7
7
  const {formattedMemberResponse} = require('./utils');
8
+ const errors = require('@tryghost/errors');
9
+ const tpl = require('@tryghost/tpl');
10
+
11
+ const messages = {
12
+ missingUuid: 'Missing uuid.',
13
+ invalidUuid: 'Invalid uuid.'
14
+ };
8
15
 
9
16
  // @TODO: This piece of middleware actually belongs to the frontend, not to the member app
10
17
  // Need to figure a way to separate these things (e.g. frontend actually talks to members API)
@@ -20,6 +27,38 @@ const loadMemberSession = async function (req, res, next) {
20
27
  }
21
28
  };
22
29
 
30
+ /**
31
+ * Require member authentication, and make it possible to authenticate via uuid.
32
+ * You can chain this after loadMemberSession to make it possible to authetnicate via both the uuid and the session.
33
+ */
34
+ const authMemberByUuid = async function (req, res, next) {
35
+ try {
36
+ const uuid = req.query.uuid;
37
+ if (!uuid) {
38
+ if (res.locals.member && req.member) {
39
+ // Already authenticated via session
40
+ return next();
41
+ }
42
+
43
+ throw new errors.UnauthorizedError({
44
+ messsage: tpl(messages.missingUuid)
45
+ });
46
+ }
47
+
48
+ const member = await membersService.api.memberBREADService.read({uuid});
49
+ if (!member) {
50
+ throw new errors.UnauthorizedError({
51
+ message: tpl(messages.invalidUuid)
52
+ });
53
+ }
54
+ Object.assign(req, {member});
55
+ res.locals.member = req.member;
56
+ next();
57
+ } catch (err) {
58
+ next(err);
59
+ }
60
+ };
61
+
23
62
  const getIdentityToken = async function (req, res) {
24
63
  try {
25
64
  const token = await membersService.ssr.getIdentityTokenForMemberFromSession(req, res);
@@ -216,6 +255,7 @@ const createSessionFromMagicLink = async function (req, res, next) {
216
255
  // Set req.member & res.locals.member if a cookie is set
217
256
  module.exports = {
218
257
  loadMemberSession,
258
+ authMemberByUuid,
219
259
  createSessionFromMagicLink,
220
260
  getIdentityToken,
221
261
  getMemberNewsletters,
@@ -5,7 +5,7 @@ const _ = require('lodash');
5
5
  const errors = require('@tryghost/errors');
6
6
  const ghostVersion = require('@tryghost/version');
7
7
  const tpl = require('@tryghost/tpl');
8
- const ObjectId = require('bson-objectid');
8
+ const ObjectId = require('bson-objectid').default;
9
9
 
10
10
  const messages = {
11
11
  noPermissionToDismissNotif: 'You do not have permission to dismiss this notification.',
@@ -13,7 +13,7 @@ const mail = require('../mail');
13
13
  const SingleUseTokenProvider = require('../members/SingleUseTokenProvider');
14
14
  const urlUtils = require('../../../shared/url-utils');
15
15
 
16
- const ObjectId = require('bson-objectid');
16
+ const ObjectId = require('bson-objectid').default;
17
17
  const settingsHelpers = require('../settings-helpers');
18
18
 
19
19
  const MAGIC_LINK_TOKEN_VALIDITY = 24 * 60 * 60 * 1000;
@@ -1,6 +1,6 @@
1
1
  const debug = require('@tryghost/debug')('themes');
2
2
  const fs = require('fs-extra');
3
- const ObjectID = require('bson-objectid');
3
+ const ObjectID = require('bson-objectid').default;
4
4
 
5
5
  const tpl = require('@tryghost/tpl');
6
6
  const logging = require('@tryghost/logging');
@@ -10,6 +10,8 @@ const shared = require('../shared');
10
10
  const labs = require('../../../shared/labs');
11
11
  const errorHandler = require('@tryghost/mw-error-handler');
12
12
  const config = require('../../../shared/config');
13
+ const {http} = require('@tryghost/api-framework');
14
+ const api = require('../../api').endpoints;
13
15
 
14
16
  const commentRouter = require('../comments');
15
17
 
@@ -65,6 +67,16 @@ module.exports = function setupMembersApp() {
65
67
  // Comments
66
68
  membersApp.use('/api/comments', commentRouter());
67
69
 
70
+ // Feedback
71
+ membersApp.post(
72
+ '/api/feedback',
73
+ labs.enabledMiddleware('audienceFeedback'),
74
+ bodyParser.json({limit: '50mb'}),
75
+ middleware.loadMemberSession,
76
+ middleware.authMemberByUuid,
77
+ http(api.feedbackMembers.add)
78
+ );
79
+
68
80
  // API error handling
69
81
  membersApp.use('/api', errorHandler.resourceNotFound);
70
82
  membersApp.use('/api', errorHandler.handleJSONResponse(sentry));
@@ -26,15 +26,17 @@ const GA_FEATURES = [
26
26
  // input for the "labs" setting value
27
27
  const BETA_FEATURES = [
28
28
  'activitypub',
29
+ 'sourceAttribution',
29
30
  'memberAttribution'
30
31
  ];
31
32
 
32
33
  const ALPHA_FEATURES = [
33
34
  'urlCache',
34
35
  'beforeAfterCard',
35
- 'sourceAttribution',
36
36
  'lexicalEditor',
37
- 'exploreApp'
37
+ 'exploreApp',
38
+ 'audienceFeedback',
39
+ 'fixNewsletterLinks'
38
40
  ];
39
41
 
40
42
  module.exports.GA_KEYS = [...GA_FEATURES];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "5.18.0",
3
+ "version": "5.19.1",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -52,80 +52,81 @@
52
52
  "cli": "^1.17.0"
53
53
  },
54
54
  "dependencies": {
55
- "@sentry/node": "7.14.2",
55
+ "@sentry/node": "7.15.0",
56
56
  "@tryghost/adapter-base-cache": "0.1.2",
57
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.18.0.tgz",
57
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.19.1.tgz",
58
58
  "@tryghost/admin-api-schema": "4.2.0",
59
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.18.0.tgz",
60
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.18.0.tgz",
61
- "@tryghost/bookshelf-plugins": "0.5.2",
62
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.18.0.tgz",
59
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.19.1.tgz",
60
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.19.1.tgz",
61
+ "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.19.1.tgz",
62
+ "@tryghost/bookshelf-plugins": "0.5.4",
63
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.19.1.tgz",
63
64
  "@tryghost/color-utils": "0.1.21",
64
65
  "@tryghost/config-url-helpers": "1.0.3",
65
- "@tryghost/constants": "file:components/tryghost-constants-5.18.0.tgz",
66
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.18.0.tgz",
67
- "@tryghost/database-info": "0.3.10",
66
+ "@tryghost/constants": "file:components/tryghost-constants-5.19.1.tgz",
67
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.19.1.tgz",
68
+ "@tryghost/database-info": "0.3.11",
68
69
  "@tryghost/debug": "0.1.18",
69
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.18.0.tgz",
70
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.18.0.tgz",
71
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.18.0.tgz",
72
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.18.0.tgz",
73
- "@tryghost/errors": "1.2.17",
74
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.18.0.tgz",
70
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.19.1.tgz",
71
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.19.1.tgz",
72
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.19.1.tgz",
73
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.19.1.tgz",
74
+ "@tryghost/errors": "1.2.18",
75
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.19.1.tgz",
75
76
  "@tryghost/helpers": "1.1.74",
76
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.18.0.tgz",
77
- "@tryghost/http-cache-utils": "0.1.3",
77
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.19.1.tgz",
78
+ "@tryghost/http-cache-utils": "0.1.4",
78
79
  "@tryghost/image-transform": "1.2.2",
79
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.18.0.tgz",
80
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.19.1.tgz",
80
81
  "@tryghost/kg-card-factory": "3.1.5",
81
82
  "@tryghost/kg-default-atoms": "3.1.4",
82
83
  "@tryghost/kg-default-cards": "5.18.3",
83
- "@tryghost/kg-lexical-html-renderer": "0.0.7",
84
+ "@tryghost/kg-lexical-html-renderer": "0.0.8",
84
85
  "@tryghost/kg-mobiledoc-html-renderer": "5.3.7",
85
86
  "@tryghost/limit-service": "1.2.3",
86
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.18.0.tgz",
87
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.18.0.tgz",
88
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.18.0.tgz",
87
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.19.1.tgz",
88
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.19.1.tgz",
89
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.19.1.tgz",
89
90
  "@tryghost/logging": "2.3.2",
90
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.18.0.tgz",
91
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.18.0.tgz",
92
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.18.0.tgz",
93
- "@tryghost/member-events": "file:components/tryghost-member-events-5.18.0.tgz",
94
- "@tryghost/members-api": "file:components/tryghost-members-api-5.18.0.tgz",
95
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.18.0.tgz",
96
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.18.0.tgz",
97
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.18.0.tgz",
98
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.18.0.tgz",
99
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.18.0.tgz",
100
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.18.0.tgz",
91
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.19.1.tgz",
92
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.19.1.tgz",
93
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.19.1.tgz",
94
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.19.1.tgz",
95
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.19.1.tgz",
96
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.19.1.tgz",
97
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.19.1.tgz",
98
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.19.1.tgz",
99
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.19.1.tgz",
100
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.19.1.tgz",
101
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.19.1.tgz",
101
102
  "@tryghost/metrics": "1.0.16",
102
- "@tryghost/minifier": "file:components/tryghost-minifier-5.18.0.tgz",
103
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.18.0.tgz",
104
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.18.0.tgz",
105
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.18.0.tgz",
106
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.18.0.tgz",
107
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.18.0.tgz",
108
- "@tryghost/nodemailer": "0.3.28",
103
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.19.1.tgz",
104
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.19.1.tgz",
105
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.19.1.tgz",
106
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.19.1.tgz",
107
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.19.1.tgz",
108
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.19.1.tgz",
109
+ "@tryghost/nodemailer": "0.3.29",
109
110
  "@tryghost/nql": "0.9.2",
110
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.18.0.tgz",
111
- "@tryghost/package-json": "file:components/tryghost-package-json-5.18.0.tgz",
112
- "@tryghost/pretty-cli": "1.2.30",
113
- "@tryghost/promise": "0.1.21",
111
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.19.1.tgz",
112
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.19.1.tgz",
113
+ "@tryghost/pretty-cli": "1.2.31",
114
+ "@tryghost/promise": "0.1.22",
114
115
  "@tryghost/request": "0.1.31",
115
- "@tryghost/security": "file:components/tryghost-security-5.18.0.tgz",
116
- "@tryghost/session-service": "file:components/tryghost-session-service-5.18.0.tgz",
117
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.18.0.tgz",
116
+ "@tryghost/security": "file:components/tryghost-security-5.19.1.tgz",
117
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.19.1.tgz",
118
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.19.1.tgz",
118
119
  "@tryghost/social-urls": "0.1.33",
119
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.18.0.tgz",
120
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.18.0.tgz",
120
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.19.1.tgz",
121
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.19.1.tgz",
121
122
  "@tryghost/string": "0.2.1",
122
123
  "@tryghost/tpl": "0.1.18",
123
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.18.0.tgz",
124
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.19.1.tgz",
124
125
  "@tryghost/url-utils": "4.2.0",
125
126
  "@tryghost/validator": "0.1.29",
126
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.18.0.tgz",
127
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.19.1.tgz",
127
128
  "@tryghost/version": "0.1.16",
128
- "@tryghost/zip": "1.1.28",
129
+ "@tryghost/zip": "1.1.29",
129
130
  "amperize": "0.6.1",
130
131
  "analytics-node": "6.2.0",
131
132
  "bluebird": "3.7.2",
@@ -142,7 +143,7 @@
142
143
  "cookie-session": "2.0.0",
143
144
  "cors": "2.8.5",
144
145
  "downsize": "0.0.8",
145
- "express": "4.18.1",
146
+ "express": "4.18.2",
146
147
  "express-brute": "1.0.1",
147
148
  "express-hbs": "2.4.0",
148
149
  "express-jwt": "7.7.5",
@@ -184,29 +185,27 @@
184
185
  "xml": "1.0.1"
185
186
  },
186
187
  "optionalDependencies": {
187
- "@tryghost/html-to-mobiledoc": "1.8.14",
188
+ "@tryghost/html-to-mobiledoc": "1.8.16",
188
189
  "sqlite3": "5.1.2"
189
190
  },
190
191
  "devDependencies": {
191
- "@playwright/test": "1.26.1",
192
+ "@playwright/test": "1.27.1",
192
193
  "@tryghost/express-test": "0.11.5",
193
194
  "@tryghost/webhook-mock-receiver": "0.2.0",
194
195
  "@types/common-tags": "1.8.1",
195
196
  "c8": "7.12.0",
196
197
  "cli-progress": "3.11.2",
197
198
  "cssnano": "5.1.13",
198
- "eslint": "8.24.0",
199
- "grunt": "1.5.3",
200
- "grunt-contrib-symlink": "1.0.0",
201
- "html-validate": "7.5.0",
199
+ "eslint": "8.25.0",
200
+ "html-validate": "7.6.0",
202
201
  "inquirer": "8.2.4",
203
- "jwks-rsa": "2.1.4",
202
+ "jwks-rsa": "2.1.5",
204
203
  "mocha": "10.0.0",
205
204
  "mocha-slow-test-reporter": "0.1.2",
206
205
  "mock-knex": "TryGhost/mock-knex#8ecb8c227bf463c991c3d820d33f59efc3ab9682",
207
206
  "nock": "13.2.9",
208
207
  "papaparse": "5.3.2",
209
- "postcss": "8.4.17",
208
+ "postcss": "8.4.18",
210
209
  "postcss-cli": "10.0.0",
211
210
  "rewire": "6.0.0",
212
211
  "should": "13.2.3",
@@ -218,54 +217,55 @@
218
217
  "@tryghost/logging": "2.3.2",
219
218
  "moment": "2.24.0",
220
219
  "moment-timezone": "0.5.23",
221
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.18.0.tgz",
222
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.18.0.tgz",
223
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.18.0.tgz",
224
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.18.0.tgz",
225
- "@tryghost/constants": "file:components/tryghost-constants-5.18.0.tgz",
226
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.18.0.tgz",
227
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.18.0.tgz",
228
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.18.0.tgz",
229
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.18.0.tgz",
230
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.18.0.tgz",
231
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.18.0.tgz",
232
- "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.18.0.tgz",
233
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.18.0.tgz",
234
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.18.0.tgz",
235
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.18.0.tgz",
236
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.18.0.tgz",
237
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.18.0.tgz",
238
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.18.0.tgz",
239
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.18.0.tgz",
240
- "@tryghost/member-analytics-service": "file:components/tryghost-member-analytics-service-5.18.0.tgz",
241
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.18.0.tgz",
242
- "@tryghost/member-events": "file:components/tryghost-member-events-5.18.0.tgz",
243
- "@tryghost/members-analytics-ingress": "file:components/tryghost-members-analytics-ingress-5.18.0.tgz",
244
- "@tryghost/members-api": "file:components/tryghost-members-api-5.18.0.tgz",
245
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.18.0.tgz",
246
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.18.0.tgz",
247
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.18.0.tgz",
248
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.18.0.tgz",
249
- "@tryghost/minifier": "file:components/tryghost-minifier-5.18.0.tgz",
250
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.18.0.tgz",
251
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.18.0.tgz",
252
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.18.0.tgz",
253
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.18.0.tgz",
254
- "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.18.0.tgz",
255
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.18.0.tgz",
256
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.18.0.tgz",
257
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.18.0.tgz",
258
- "@tryghost/package-json": "file:components/tryghost-package-json-5.18.0.tgz",
259
- "@tryghost/members-payments": "file:components/tryghost-members-payments-5.18.0.tgz",
260
- "@tryghost/referrers": "file:components/tryghost-referrers-5.18.0.tgz",
261
- "@tryghost/security": "file:components/tryghost-security-5.18.0.tgz",
262
- "@tryghost/session-service": "file:components/tryghost-session-service-5.18.0.tgz",
263
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.18.0.tgz",
264
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.18.0.tgz",
265
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.18.0.tgz",
266
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.18.0.tgz",
267
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.18.0.tgz",
268
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.18.0.tgz",
269
- "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.18.0.tgz"
220
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.19.1.tgz",
221
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.19.1.tgz",
222
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.19.1.tgz",
223
+ "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.19.1.tgz",
224
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.19.1.tgz",
225
+ "@tryghost/constants": "file:components/tryghost-constants-5.19.1.tgz",
226
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.19.1.tgz",
227
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.19.1.tgz",
228
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.19.1.tgz",
229
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.19.1.tgz",
230
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.19.1.tgz",
231
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.19.1.tgz",
232
+ "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.19.1.tgz",
233
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.19.1.tgz",
234
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.19.1.tgz",
235
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.19.1.tgz",
236
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.19.1.tgz",
237
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.19.1.tgz",
238
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.19.1.tgz",
239
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.19.1.tgz",
240
+ "@tryghost/member-analytics-service": "file:components/tryghost-member-analytics-service-5.19.1.tgz",
241
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.19.1.tgz",
242
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.19.1.tgz",
243
+ "@tryghost/members-analytics-ingress": "file:components/tryghost-members-analytics-ingress-5.19.1.tgz",
244
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.19.1.tgz",
245
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.19.1.tgz",
246
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.19.1.tgz",
247
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.19.1.tgz",
248
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.19.1.tgz",
249
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.19.1.tgz",
250
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.19.1.tgz",
251
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.19.1.tgz",
252
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.19.1.tgz",
253
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.19.1.tgz",
254
+ "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.19.1.tgz",
255
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.19.1.tgz",
256
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.19.1.tgz",
257
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.19.1.tgz",
258
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.19.1.tgz",
259
+ "@tryghost/members-payments": "file:components/tryghost-members-payments-5.19.1.tgz",
260
+ "@tryghost/referrers": "file:components/tryghost-referrers-5.19.1.tgz",
261
+ "@tryghost/security": "file:components/tryghost-security-5.19.1.tgz",
262
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.19.1.tgz",
263
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.19.1.tgz",
264
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.19.1.tgz",
265
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.19.1.tgz",
266
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.19.1.tgz",
267
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.19.1.tgz",
268
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.19.1.tgz",
269
+ "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.19.1.tgz"
270
270
  }
271
271
  }