ghost 5.16.2 → 5.17.0

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 (144) hide show
  1. package/components/tryghost-adapter-manager-5.17.0.tgz +0 -0
  2. package/components/tryghost-api-framework-5.17.0.tgz +0 -0
  3. package/components/tryghost-api-version-compatibility-service-5.17.0.tgz +0 -0
  4. package/components/tryghost-bootstrap-socket-5.17.0.tgz +0 -0
  5. package/components/tryghost-constants-5.17.0.tgz +0 -0
  6. package/components/tryghost-custom-theme-settings-service-5.17.0.tgz +0 -0
  7. package/components/tryghost-domain-events-5.17.0.tgz +0 -0
  8. package/components/tryghost-email-analytics-provider-mailgun-5.17.0.tgz +0 -0
  9. package/components/{tryghost-email-analytics-service-5.16.2.tgz → tryghost-email-analytics-service-5.17.0.tgz} +0 -0
  10. package/components/tryghost-email-content-generator-5.17.0.tgz +0 -0
  11. package/components/tryghost-express-dynamic-redirects-5.17.0.tgz +0 -0
  12. package/components/tryghost-extract-api-key-5.17.0.tgz +0 -0
  13. package/components/tryghost-html-to-plaintext-5.17.0.tgz +0 -0
  14. package/components/tryghost-job-manager-5.17.0.tgz +0 -0
  15. package/components/tryghost-link-redirects-5.17.0.tgz +0 -0
  16. package/components/tryghost-link-replacer-5.17.0.tgz +0 -0
  17. package/components/tryghost-link-tracking-5.17.0.tgz +0 -0
  18. package/components/tryghost-magic-link-5.17.0.tgz +0 -0
  19. package/components/tryghost-mailgun-client-5.17.0.tgz +0 -0
  20. package/components/tryghost-member-analytics-service-5.17.0.tgz +0 -0
  21. package/components/tryghost-member-attribution-5.17.0.tgz +0 -0
  22. package/components/tryghost-member-events-5.17.0.tgz +0 -0
  23. package/components/tryghost-members-analytics-ingress-5.17.0.tgz +0 -0
  24. package/components/tryghost-members-api-5.17.0.tgz +0 -0
  25. package/components/tryghost-members-csv-5.17.0.tgz +0 -0
  26. package/components/tryghost-members-events-service-5.17.0.tgz +0 -0
  27. package/components/tryghost-members-importer-5.17.0.tgz +0 -0
  28. package/components/tryghost-members-offers-5.17.0.tgz +0 -0
  29. package/components/{tryghost-members-payments-5.16.2.tgz → tryghost-members-payments-5.17.0.tgz} +0 -0
  30. package/components/{tryghost-members-ssr-5.16.2.tgz → tryghost-members-ssr-5.17.0.tgz} +0 -0
  31. package/components/tryghost-members-stripe-service-5.17.0.tgz +0 -0
  32. package/components/tryghost-minifier-5.17.0.tgz +0 -0
  33. package/components/tryghost-mw-api-version-mismatch-5.17.0.tgz +0 -0
  34. package/components/tryghost-mw-cache-control-5.17.0.tgz +0 -0
  35. package/components/tryghost-mw-error-handler-5.17.0.tgz +0 -0
  36. package/components/tryghost-mw-session-from-token-5.17.0.tgz +0 -0
  37. package/components/tryghost-mw-update-user-last-seen-5.17.0.tgz +0 -0
  38. package/components/tryghost-mw-vhost-5.17.0.tgz +0 -0
  39. package/components/{tryghost-oembed-service-5.16.2.tgz → tryghost-oembed-service-5.17.0.tgz} +0 -0
  40. package/components/{tryghost-package-json-5.16.2.tgz → tryghost-package-json-5.17.0.tgz} +0 -0
  41. package/components/tryghost-referrers-5.17.0.tgz +0 -0
  42. package/components/{tryghost-security-5.16.2.tgz → tryghost-security-5.17.0.tgz} +0 -0
  43. package/components/tryghost-session-service-5.17.0.tgz +0 -0
  44. package/components/tryghost-settings-path-manager-5.17.0.tgz +0 -0
  45. package/components/tryghost-staff-service-5.17.0.tgz +0 -0
  46. package/components/tryghost-stats-service-5.17.0.tgz +0 -0
  47. package/components/tryghost-update-check-service-5.17.0.tgz +0 -0
  48. package/components/{tryghost-verification-trigger-5.16.2.tgz → tryghost-verification-trigger-5.17.0.tgz} +0 -0
  49. package/components/{tryghost-version-notifications-data-service-5.16.2.tgz → tryghost-version-notifications-data-service-5.17.0.tgz} +0 -0
  50. package/core/built/admin/assets/{chunk.143.4e48bf4e6c3d13258bb1.js → chunk.143.4ce1dcfd5c372638114d.js} +6 -6
  51. package/core/built/admin/assets/{chunk.174.e1e89637eab79fdd5c5d.js → chunk.174.37fefc669899f0fd0064.js} +153 -153
  52. package/core/built/admin/assets/{chunk.178.9c6e85adf674bd785cf1.js → chunk.178.824dedc0f9c31a8f64a7.js} +4 -4
  53. package/core/built/admin/assets/{chunk.579.d14c3688558f34afeb3e.js → chunk.579.a9bccec4d650a7be727a.js} +142 -88
  54. package/core/built/admin/assets/{chunk.579.d14c3688558f34afeb3e.js.LICENSE.txt → chunk.579.a9bccec4d650a7be727a.js.LICENSE.txt} +0 -0
  55. package/core/built/admin/assets/ghost-597fb8e8b1b91dd0ac4d9f2d75bd67fb.css +1 -0
  56. package/core/built/admin/assets/ghost-dark-e4ccecd9903d35d360d71fe859cbb3bf.css +1 -0
  57. package/core/built/admin/assets/{ghost-5064a384fad1061ca77a8604e479da90.js → ghost-fa7772f8aa2522b3935efed71fa75619.js} +390 -342
  58. package/core/built/admin/assets/vendor-325e038b8609f0979f6578cae7a87f9e.js +13270 -0
  59. package/core/built/admin/index.html +6 -6
  60. package/core/frontend/helpers/ghost_head.js +1 -1
  61. package/core/frontend/src/member-attribution/member-attribution.js +14 -14
  62. package/core/frontend/web/middleware/error-handler.js +3 -1
  63. package/core/frontend/web/site.js +9 -9
  64. package/core/server/api/endpoints/pages.js +1 -1
  65. package/core/server/api/endpoints/posts.js +1 -1
  66. package/core/server/api/endpoints/utils/serializers/input/pages.js +1 -1
  67. package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -2
  68. package/core/server/api/endpoints/utils/serializers/output/mappers/activity-feed-events.js +23 -0
  69. package/core/server/api/endpoints/utils/serializers/output/members.js +20 -3
  70. package/core/server/api/endpoints/utils/validators/input/pages.js +5 -1
  71. package/core/server/api/endpoints/utils/validators/input/posts.js +5 -1
  72. package/core/server/data/exporter/table-lists.js +2 -2
  73. package/core/server/data/migrations/utils/tables.js +1 -1
  74. package/core/server/data/migrations/versions/5.16/2022-09-19-09-04-add-link-redirects-table.js +9 -10
  75. package/core/server/data/migrations/versions/5.16/2022-09-19-09-05-add-members-link-click-events-table.js +9 -8
  76. package/core/server/data/migrations/versions/5.17/2022-09-27-13-53-remove-click-tracking-tables.js +28 -0
  77. package/core/server/data/migrations/versions/5.17/2022-09-27-13-55-add-redirects-table.js +10 -0
  78. package/core/server/data/migrations/versions/5.17/2022-09-27-13-56-add-members-click-events-table.js +8 -0
  79. package/core/server/data/migrations/versions/5.17/2022-09-27-16-49-set-track-clicks-based-on-opens.js +31 -0
  80. package/core/server/data/migrations/versions/5.17/2022-09-29-12-39-add-track-clicks-column-to-emails.js +7 -0
  81. package/core/server/data/schema/schema.js +4 -3
  82. package/core/server/models/email.js +1 -0
  83. package/core/server/models/{member-link-click-event.js → member-click-event.js} +6 -6
  84. package/core/server/models/member.js +22 -0
  85. package/core/server/models/post.js +6 -6
  86. package/core/server/models/{link-redirect.js → redirect.js} +7 -7
  87. package/core/server/services/api-version-compatibility/index.js +6 -1
  88. package/core/server/services/link-redirection/index.js +1 -1
  89. package/core/server/services/link-tracking/LinkClickRepository.js +2 -2
  90. package/core/server/services/link-tracking/index.js +4 -4
  91. package/core/server/services/mega/mega.js +1 -0
  92. package/core/server/services/mega/post-email-serializer.js +17 -28
  93. package/core/server/services/member-attribution/index.js +2 -1
  94. package/core/server/services/members/api.js +1 -1
  95. package/core/server/web/api/endpoints/content/app.js +5 -2
  96. package/core/server/web/well-known.js +5 -1
  97. package/core/shared/config/defaults.json +14 -2
  98. package/core/shared/labs.js +2 -2
  99. package/package.json +106 -105
  100. package/yarn.lock +311 -299
  101. package/components/tryghost-adapter-manager-5.16.2.tgz +0 -0
  102. package/components/tryghost-api-framework-5.16.2.tgz +0 -0
  103. package/components/tryghost-api-version-compatibility-service-5.16.2.tgz +0 -0
  104. package/components/tryghost-bootstrap-socket-5.16.2.tgz +0 -0
  105. package/components/tryghost-constants-5.16.2.tgz +0 -0
  106. package/components/tryghost-custom-theme-settings-service-5.16.2.tgz +0 -0
  107. package/components/tryghost-domain-events-5.16.2.tgz +0 -0
  108. package/components/tryghost-email-analytics-provider-mailgun-5.16.2.tgz +0 -0
  109. package/components/tryghost-email-content-generator-5.16.2.tgz +0 -0
  110. package/components/tryghost-express-dynamic-redirects-5.16.2.tgz +0 -0
  111. package/components/tryghost-extract-api-key-5.16.2.tgz +0 -0
  112. package/components/tryghost-html-to-plaintext-5.16.2.tgz +0 -0
  113. package/components/tryghost-job-manager-5.16.2.tgz +0 -0
  114. package/components/tryghost-link-redirects-5.16.2.tgz +0 -0
  115. package/components/tryghost-link-replacer-5.16.2.tgz +0 -0
  116. package/components/tryghost-link-tracking-5.16.2.tgz +0 -0
  117. package/components/tryghost-magic-link-5.16.2.tgz +0 -0
  118. package/components/tryghost-mailgun-client-5.16.2.tgz +0 -0
  119. package/components/tryghost-member-analytics-service-5.16.2.tgz +0 -0
  120. package/components/tryghost-member-attribution-5.16.2.tgz +0 -0
  121. package/components/tryghost-member-events-5.16.2.tgz +0 -0
  122. package/components/tryghost-members-analytics-ingress-5.16.2.tgz +0 -0
  123. package/components/tryghost-members-api-5.16.2.tgz +0 -0
  124. package/components/tryghost-members-csv-5.16.2.tgz +0 -0
  125. package/components/tryghost-members-events-service-5.16.2.tgz +0 -0
  126. package/components/tryghost-members-importer-5.16.2.tgz +0 -0
  127. package/components/tryghost-members-offers-5.16.2.tgz +0 -0
  128. package/components/tryghost-members-stripe-service-5.16.2.tgz +0 -0
  129. package/components/tryghost-minifier-5.16.2.tgz +0 -0
  130. package/components/tryghost-mw-api-version-mismatch-5.16.2.tgz +0 -0
  131. package/components/tryghost-mw-cache-control-5.16.2.tgz +0 -0
  132. package/components/tryghost-mw-error-handler-5.16.2.tgz +0 -0
  133. package/components/tryghost-mw-session-from-token-5.16.2.tgz +0 -0
  134. package/components/tryghost-mw-update-user-last-seen-5.16.2.tgz +0 -0
  135. package/components/tryghost-mw-vhost-5.16.2.tgz +0 -0
  136. package/components/tryghost-referrers-5.16.2.tgz +0 -0
  137. package/components/tryghost-session-service-5.16.2.tgz +0 -0
  138. package/components/tryghost-settings-path-manager-5.16.2.tgz +0 -0
  139. package/components/tryghost-staff-service-5.16.2.tgz +0 -0
  140. package/components/tryghost-stats-service-5.16.2.tgz +0 -0
  141. package/components/tryghost-update-check-service-5.16.2.tgz +0 -0
  142. package/core/built/admin/assets/ghost-6491d134c450ca676911ea17e16cd7d4.css +0 -1
  143. package/core/built/admin/assets/ghost-dark-297ab2fcf4cadd1c950b84089a38c5e2.css +0 -1
  144. package/core/built/admin/assets/vendor-b2375e2f383cbc3fd73340c4b656c993.js +0 -13654
@@ -1,8 +1,8 @@
1
1
  const ghostBookshelf = require('./base');
2
2
  const urlUtils = require('../../shared/url-utils');
3
3
 
4
- const LinkRedirect = ghostBookshelf.Model.extend({
5
- tableName: 'link_redirects',
4
+ const Redirect = ghostBookshelf.Model.extend({
5
+ tableName: 'redirects',
6
6
 
7
7
  post() {
8
8
  return this.belongsTo('Post', 'post_id');
@@ -49,10 +49,10 @@ const LinkRedirect = ghostBookshelf.Model.extend({
49
49
  countRelations() {
50
50
  return {
51
51
  clicks(modelOrCollection) {
52
- modelOrCollection.query('columns', 'link_redirects.*', (qb) => {
53
- qb.countDistinct('members_link_click_events.member_id')
54
- .from('members_link_click_events')
55
- .whereRaw('link_redirects.id = members_link_click_events.link_id')
52
+ modelOrCollection.query('columns', 'redirects.*', (qb) => {
53
+ qb.countDistinct('members_click_events.member_id')
54
+ .from('members_click_events')
55
+ .whereRaw('redirects.id = members_click_events.redirect_id')
56
56
  .as('count__clicks');
57
57
  });
58
58
  }
@@ -61,5 +61,5 @@ const LinkRedirect = ghostBookshelf.Model.extend({
61
61
  });
62
62
 
63
63
  module.exports = {
64
- LinkRedirect: ghostBookshelf.model('LinkRedirect', LinkRedirect)
64
+ Redirect: ghostBookshelf.model('Redirect', Redirect)
65
65
  };
@@ -31,7 +31,9 @@ module.exports.errorHandler = (err, req, res, next) => {
31
31
 
32
32
  /**
33
33
  * If Accept-Version is set on the request set Content-Version on the response
34
- *
34
+ * Also, add 'Accept-Version' to VARY as it effects response caching
35
+ * TODO: move the method to mw once back-compatibility with 4.x is sorted
36
+ *
35
37
  * @param {import('express').Request} req
36
38
  * @param {import('express').Response} res
37
39
  * @param {import('express').NextFunction} next
@@ -40,6 +42,9 @@ module.exports.contentVersion = (req, res, next) => {
40
42
  if (req.header('accept-version')) {
41
43
  res.header('Content-Version', `v${ghostVersion.safe}`);
42
44
  }
45
+
46
+ res.vary('Accept-Version');
47
+
43
48
  next();
44
49
  };
45
50
 
@@ -14,7 +14,7 @@ class LinkRedirectsServiceWrapper {
14
14
  const {LinkRedirectsService} = require('@tryghost/link-redirects');
15
15
 
16
16
  this.linkRedirectRepository = new LinkRedirectRepository({
17
- LinkRedirect: models.LinkRedirect,
17
+ LinkRedirect: models.Redirect,
18
18
  urlUtils
19
19
  });
20
20
 
@@ -36,7 +36,7 @@ module.exports = class LinkClickRepository {
36
36
  for (const model of collection.models) {
37
37
  const member = await this.#Member.findOne({id: model.get('member_id')});
38
38
  result.push(new LinkClick({
39
- link_id: model.get('link_id'),
39
+ link_id: model.get('redirect_id'),
40
40
  member_uuid: member.get('uuid')
41
41
  }));
42
42
  }
@@ -57,7 +57,7 @@ module.exports = class LinkClickRepository {
57
57
 
58
58
  const model = await this.#MemberLinkClickEventModel.add({
59
59
  // Only store the parthname (no support for variable query strings)
60
- link_id: linkClick.link_id.toHexString(),
60
+ redirect_id: linkClick.link_id.toHexString(),
61
61
  member_id: member.id
62
62
  }, {});
63
63
 
@@ -22,12 +22,12 @@ class LinkTrackingServiceWrapper {
22
22
  const {LinkClickTrackingService} = require('@tryghost/link-tracking');
23
23
 
24
24
  const postLinkRepository = new PostLinkRepository({
25
- LinkRedirect: models.LinkRedirect,
25
+ LinkRedirect: models.Redirect,
26
26
  linkRedirectRepository: linkRedirection.linkRedirectRepository
27
27
  });
28
28
 
29
- const linkClickRepository = new LinkClickRepository({
30
- MemberLinkClickEventModel: models.MemberLinkClickEvent,
29
+ this.linkClickRepository = new LinkClickRepository({
30
+ MemberLinkClickEventModel: models.MemberClickEvent,
31
31
  Member: models.Member,
32
32
  MemberLinkClickEvent: MemberLinkClickEvent,
33
33
  DomainEvents
@@ -36,7 +36,7 @@ class LinkTrackingServiceWrapper {
36
36
  // Expose the service
37
37
  this.service = new LinkClickTrackingService({
38
38
  linkRedirectService: linkRedirection.service,
39
- linkClickRepository,
39
+ linkClickRepository: this.linkClickRepository,
40
40
  postLinkRepository,
41
41
  DomainEvents
42
42
  });
@@ -239,6 +239,7 @@ const addEmail = async (postModel, options) => {
239
239
  plaintext: emailData.plaintext,
240
240
  submitted_at: moment().toDate(),
241
241
  track_opens: !!settingsCache.get('email_track_opens'),
242
+ track_clicks: !!settingsCache.get('email_track_clicks'),
242
243
  recipient_filter: emailRecipientFilter,
243
244
  newsletter_id: newsletter.id
244
245
  }, knexOptions);
@@ -2,7 +2,6 @@ const _ = require('lodash');
2
2
  const template = require('./template');
3
3
  const settingsCache = require('../../../shared/settings-cache');
4
4
  const urlUtils = require('../../../shared/url-utils');
5
- const labs = require('../../../shared/labs');
6
5
  const moment = require('moment-timezone');
7
6
  const api = require('../../api').endpoints;
8
7
  const apiFramework = require('@tryghost/api-framework');
@@ -357,34 +356,24 @@ const PostEmailSerializer = {
357
356
  }
358
357
 
359
358
  // Now replace the links in the HTML version
360
- if (labs.isSet('emailClicks')) {
361
- if ((!options.isBrowserPreview && !options.isTestEmail) || process.env.NODE_ENV === 'development') {
362
- const enableTracking = settingsCache.get('email_track_clicks');
363
- result.html = await linkReplacer.replace(result.html, async (url) => {
364
- // Add newsletter source attribution
365
- url = memberAttribution.service.addEmailSourceAttributionTracking(url, newsletter);
366
- const isSite = urlUtils.isSiteUrl(url);
367
-
368
- // Add post attribution tracking
369
- if (isSite && enableTracking) {
370
- // Only add attribution links to our own site (except for the newsletter referrer)
371
- url = memberAttribution.service.addPostAttributionTracking(url, post);
372
- }
373
-
374
- // Add link click tracking
375
- if (enableTracking) {
376
- url = await linkTracking.service.addTrackingToUrl(url, post, '--uuid--');
377
-
378
- // We need to convert to a string at this point, because we need invalid string characters in the URL
379
- const str = url.toString().replace(/--uuid--/g, '%%{uuid}%%');
380
- return str;
381
- }
359
+ if (!options.isBrowserPreview && !options.isTestEmail && settingsCache.get('email_track_clicks')) {
360
+ result.html = await linkReplacer.replace(result.html, async (url) => {
361
+ // Add newsletter source attribution
362
+ url = memberAttribution.service.addEmailSourceAttributionTracking(url, newsletter);
363
+ const isSite = urlUtils.isSiteUrl(url);
364
+
365
+ if (isSite) {
366
+ // Only add post attribution to our own site (because external sites could/should not process this information)
367
+ url = memberAttribution.service.addPostAttributionTracking(url, post);
368
+ }
382
369
 
383
- // Replace the URL with a normal redirect so we can change it later, but don't include tracking
384
- url = linkTracking.service.addRedirectToUrl(url, post);
385
- return url;
386
- });
387
- }
370
+ // Add link click tracking
371
+ url = await linkTracking.service.addTrackingToUrl(url, post, '--uuid--');
372
+
373
+ // We need to convert to a string at this point, because we need invalid string characters in the URL
374
+ const str = url.toString().replace(/--uuid--/g, '%%{uuid}%%');
375
+ return str;
376
+ });
388
377
  }
389
378
 
390
379
  // Clean up any unknown replacements strings to get our final content
@@ -35,7 +35,8 @@ class MemberAttributionServiceWrapper {
35
35
  this.service = new MemberAttributionService({
36
36
  models: {
37
37
  MemberCreatedEvent: models.MemberCreatedEvent,
38
- SubscriptionCreatedEvent: models.SubscriptionCreatedEvent
38
+ SubscriptionCreatedEvent: models.SubscriptionCreatedEvent,
39
+ Integration: models.Integration
39
40
  },
40
41
  attributionBuilder: this.attributionBuilder
41
42
  });
@@ -187,7 +187,7 @@ function createApiInstance(config) {
187
187
  MemberAnalyticEvent: models.MemberAnalyticEvent,
188
188
  MemberCreatedEvent: models.MemberCreatedEvent,
189
189
  SubscriptionCreatedEvent: models.SubscriptionCreatedEvent,
190
- MemberLinkClickEvent: models.MemberLinkClickEvent,
190
+ MemberLinkClickEvent: models.MemberClickEvent,
191
191
  OfferRedemption: models.OfferRedemption,
192
192
  Offer: models.Offer,
193
193
  StripeProduct: models.StripeProduct,
@@ -3,6 +3,7 @@ const boolParser = require('express-query-boolean');
3
3
  const bodyParser = require('body-parser');
4
4
  const express = require('../../../../../shared/express');
5
5
  const sentry = require('../../../../../shared/sentry');
6
+ const config = require('../../../../../shared/config');
6
7
  const shared = require('../../../shared');
7
8
  const routes = require('./routes');
8
9
  const errorHandler = require('@tryghost/mw-error-handler');
@@ -20,8 +21,10 @@ module.exports = function setupApiApp() {
20
21
  // Query parsing
21
22
  apiApp.use(boolParser());
22
23
 
23
- // API shouldn't be cached
24
- apiApp.use(shared.middleware.cacheControl('private'));
24
+ // Content API should allow public caching
25
+ apiApp.use(shared.middleware.cacheControl('public', {
26
+ maxAge: config.get('caching:contentAPI:maxAge')
27
+ }));
25
28
 
26
29
  // Routing
27
30
  apiApp.use(routes());
@@ -1,5 +1,7 @@
1
+ const cacheControl = require('@tryghost/mw-cache-control');
1
2
  const express = require('../../shared/express');
2
3
  const settings = require('../../shared/settings-cache');
4
+ const config = require('../../shared/config');
3
5
 
4
6
  module.exports = function setupWellKnownApp() {
5
7
  const wellKnownApp = express('well-known');
@@ -14,7 +16,9 @@ module.exports = function setupWellKnownApp() {
14
16
  return keyStore.toJSON();
15
17
  };
16
18
 
17
- wellKnownApp.get('/jwks.json', async (req, res) => {
19
+ const cache = cacheControl('public', {maxAge: config.get('caching:wellKnown:maxAge')});
20
+
21
+ wellKnownApp.get('/jwks.json', cache, async (req, res) => {
18
22
  const jwks = await getSafePublicJWKS();
19
23
 
20
24
  // there's only one key in the store atm
@@ -105,6 +105,9 @@
105
105
  "frontend": {
106
106
  "maxAge": 0
107
107
  },
108
+ "publicAssets": {
109
+ "maxAge": 31536000
110
+ },
108
111
  "301": {
109
112
  "maxAge": 31536000
110
113
  },
@@ -117,11 +120,20 @@
117
120
  "sitemap": {
118
121
  "maxAge": 3600
119
122
  },
123
+ "sitemapXSL": {
124
+ "maxAge": 86400
125
+ },
120
126
  "robotstxt": {
121
- "maxAge": 3600000
127
+ "maxAge": 3600
128
+ },
129
+ "wellKnown": {
130
+ "maxAge": 86400
122
131
  },
123
132
  "cors": {
124
133
  "maxAge": 86400
134
+ },
135
+ "contentAPI": {
136
+ "maxAge": 0
125
137
  }
126
138
  },
127
139
  "imageOptimization": {
@@ -140,7 +152,7 @@
140
152
  },
141
153
  "portal": {
142
154
  "url": "https://cdn.jsdelivr.net/ghost/portal@~{version}/umd/portal.min.js",
143
- "version": "2.12"
155
+ "version": "2.13"
144
156
  },
145
157
  "sodoSearch": {
146
158
  "url": "https://cdn.jsdelivr.net/ghost/sodo-search@~{version}/umd/sodo-search.min.js",
@@ -19,7 +19,8 @@ const GA_FEATURES = [
19
19
  'freeTrial',
20
20
  'compExpiring',
21
21
  'searchHelper',
22
- 'emailAlerts'
22
+ 'emailAlerts',
23
+ 'emailClicks'
23
24
  ];
24
25
 
25
26
  // NOTE: this allowlist is meant to be used to filter out any unexpected
@@ -32,7 +33,6 @@ const BETA_FEATURES = [
32
33
  const ALPHA_FEATURES = [
33
34
  'urlCache',
34
35
  'beforeAfterCard',
35
- 'emailClicks',
36
36
  'sourceAttribution',
37
37
  'lexicalEditor'
38
38
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "5.16.2",
3
+ "version": "5.17.0",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -22,7 +22,7 @@
22
22
  "scripts": {
23
23
  "start": "node index",
24
24
  "setup": "knex-migrator init && grunt symlink || (exit 0)",
25
- "build": "yarn workspace ghost-admin run build",
25
+ "build": "npm pack --pack-destination ../..",
26
26
  "test": "yarn test:unit",
27
27
  "test:single": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js --timeout=60000",
28
28
  "test:all": "yarn test:unit && yarn test:integration && yarn test:e2e && yarn lint",
@@ -52,77 +52,78 @@
52
52
  "cli": "^1.17.0"
53
53
  },
54
54
  "dependencies": {
55
- "@sentry/node": "7.13.0",
55
+ "@sentry/node": "7.14.0",
56
56
  "@tryghost/adapter-base-cache": "0.1.2",
57
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.16.2.tgz",
57
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.17.0.tgz",
58
58
  "@tryghost/admin-api-schema": "4.2.0",
59
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.16.2.tgz",
60
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.16.2.tgz",
61
- "@tryghost/bookshelf-plugins": "0.5.1",
62
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.16.2.tgz",
59
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.17.0.tgz",
60
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.17.0.tgz",
61
+ "@tryghost/bookshelf-plugins": "0.5.2",
62
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.17.0.tgz",
63
63
  "@tryghost/color-utils": "0.1.21",
64
64
  "@tryghost/config-url-helpers": "1.0.3",
65
- "@tryghost/constants": "file:components/tryghost-constants-5.16.2.tgz",
66
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.16.2.tgz",
65
+ "@tryghost/constants": "file:components/tryghost-constants-5.17.0.tgz",
66
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.17.0.tgz",
67
67
  "@tryghost/database-info": "0.3.10",
68
68
  "@tryghost/debug": "0.1.18",
69
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.16.2.tgz",
70
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.16.2.tgz",
71
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.16.2.tgz",
72
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.16.2.tgz",
73
- "@tryghost/errors": "1.2.16",
74
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.16.2.tgz",
69
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.17.0.tgz",
70
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.17.0.tgz",
71
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.17.0.tgz",
72
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.17.0.tgz",
73
+ "@tryghost/errors": "1.2.17",
74
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.17.0.tgz",
75
75
  "@tryghost/helpers": "1.1.74",
76
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.16.2.tgz",
76
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.17.0.tgz",
77
+ "@tryghost/http-cache-utils": "0.1.3",
77
78
  "@tryghost/image-transform": "1.2.2",
78
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.16.2.tgz",
79
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.17.0.tgz",
79
80
  "@tryghost/kg-card-factory": "3.1.5",
80
81
  "@tryghost/kg-default-atoms": "3.1.4",
81
82
  "@tryghost/kg-default-cards": "5.18.3",
82
83
  "@tryghost/kg-lexical-html-renderer": "0.0.7",
83
84
  "@tryghost/kg-mobiledoc-html-renderer": "5.3.7",
84
85
  "@tryghost/limit-service": "1.2.3",
85
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.16.2.tgz",
86
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.16.2.tgz",
87
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.16.2.tgz",
88
- "@tryghost/logging": "2.3.1",
89
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.16.2.tgz",
90
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.16.2.tgz",
91
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.16.2.tgz",
92
- "@tryghost/member-events": "file:components/tryghost-member-events-5.16.2.tgz",
93
- "@tryghost/members-api": "file:components/tryghost-members-api-5.16.2.tgz",
94
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.16.2.tgz",
95
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.16.2.tgz",
96
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.16.2.tgz",
97
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.16.2.tgz",
98
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.16.2.tgz",
99
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.16.2.tgz",
86
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.17.0.tgz",
87
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.17.0.tgz",
88
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.17.0.tgz",
89
+ "@tryghost/logging": "2.3.2",
90
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.17.0.tgz",
91
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.17.0.tgz",
92
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.17.0.tgz",
93
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.17.0.tgz",
94
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.17.0.tgz",
95
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.17.0.tgz",
96
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.17.0.tgz",
97
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.17.0.tgz",
98
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.17.0.tgz",
99
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.17.0.tgz",
100
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.17.0.tgz",
100
101
  "@tryghost/metrics": "1.0.16",
101
- "@tryghost/minifier": "file:components/tryghost-minifier-5.16.2.tgz",
102
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.16.2.tgz",
103
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.16.2.tgz",
104
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.16.2.tgz",
105
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.16.2.tgz",
106
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.16.2.tgz",
107
- "@tryghost/nodemailer": "0.3.27",
102
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.17.0.tgz",
103
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.17.0.tgz",
104
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.17.0.tgz",
105
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.17.0.tgz",
106
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.17.0.tgz",
107
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.17.0.tgz",
108
+ "@tryghost/nodemailer": "0.3.28",
108
109
  "@tryghost/nql": "0.9.2",
109
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.16.2.tgz",
110
- "@tryghost/package-json": "file:components/tryghost-package-json-5.16.2.tgz",
110
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.17.0.tgz",
111
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.17.0.tgz",
111
112
  "@tryghost/pretty-cli": "1.2.30",
112
113
  "@tryghost/promise": "0.1.21",
113
- "@tryghost/request": "0.1.30",
114
- "@tryghost/security": "file:components/tryghost-security-5.16.2.tgz",
115
- "@tryghost/session-service": "file:components/tryghost-session-service-5.16.2.tgz",
116
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.16.2.tgz",
114
+ "@tryghost/request": "0.1.31",
115
+ "@tryghost/security": "file:components/tryghost-security-5.17.0.tgz",
116
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.17.0.tgz",
117
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.17.0.tgz",
117
118
  "@tryghost/social-urls": "0.1.33",
118
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.16.2.tgz",
119
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.16.2.tgz",
119
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.17.0.tgz",
120
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.17.0.tgz",
120
121
  "@tryghost/string": "0.2.1",
121
122
  "@tryghost/tpl": "0.1.18",
122
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.16.2.tgz",
123
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.17.0.tgz",
123
124
  "@tryghost/url-utils": "4.2.0",
124
- "@tryghost/validator": "0.1.28",
125
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.16.2.tgz",
125
+ "@tryghost/validator": "0.1.29",
126
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.17.0.tgz",
126
127
  "@tryghost/version": "0.1.16",
127
128
  "@tryghost/zip": "1.1.28",
128
129
  "amperize": "0.6.1",
@@ -183,18 +184,18 @@
183
184
  "xml": "1.0.1"
184
185
  },
185
186
  "optionalDependencies": {
186
- "@tryghost/html-to-mobiledoc": "1.8.13",
187
+ "@tryghost/html-to-mobiledoc": "1.8.14",
187
188
  "sqlite3": "5.1.1"
188
189
  },
189
190
  "devDependencies": {
190
- "@playwright/test": "1.26.0",
191
- "@tryghost/express-test": "0.11.4",
191
+ "@playwright/test": "1.26.1",
192
+ "@tryghost/express-test": "0.11.5",
192
193
  "@tryghost/webhook-mock-receiver": "0.1.2",
193
194
  "@types/common-tags": "1.8.1",
194
195
  "c8": "7.12.0",
195
196
  "cli-progress": "3.11.2",
196
197
  "cssnano": "5.1.13",
197
- "eslint": "8.23.1",
198
+ "eslint": "8.24.0",
198
199
  "grunt": "1.5.3",
199
200
  "grunt-contrib-symlink": "1.0.0",
200
201
  "html-validate": "7.5.0",
@@ -214,57 +215,57 @@
214
215
  "tmp": "0.2.1"
215
216
  },
216
217
  "resolutions": {
217
- "@tryghost/logging": "2.3.1",
218
+ "@tryghost/logging": "2.3.2",
218
219
  "moment": "2.24.0",
219
220
  "moment-timezone": "0.5.23",
220
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.16.2.tgz",
221
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.16.2.tgz",
222
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.16.2.tgz",
223
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.16.2.tgz",
224
- "@tryghost/constants": "file:components/tryghost-constants-5.16.2.tgz",
225
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.16.2.tgz",
226
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.16.2.tgz",
227
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.16.2.tgz",
228
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.16.2.tgz",
229
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.16.2.tgz",
230
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.16.2.tgz",
231
- "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.16.2.tgz",
232
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.16.2.tgz",
233
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.16.2.tgz",
234
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.16.2.tgz",
235
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.16.2.tgz",
236
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.16.2.tgz",
237
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.16.2.tgz",
238
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.16.2.tgz",
239
- "@tryghost/member-analytics-service": "file:components/tryghost-member-analytics-service-5.16.2.tgz",
240
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.16.2.tgz",
241
- "@tryghost/member-events": "file:components/tryghost-member-events-5.16.2.tgz",
242
- "@tryghost/members-analytics-ingress": "file:components/tryghost-members-analytics-ingress-5.16.2.tgz",
243
- "@tryghost/members-api": "file:components/tryghost-members-api-5.16.2.tgz",
244
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.16.2.tgz",
245
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.16.2.tgz",
246
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.16.2.tgz",
247
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.16.2.tgz",
248
- "@tryghost/minifier": "file:components/tryghost-minifier-5.16.2.tgz",
249
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.16.2.tgz",
250
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.16.2.tgz",
251
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.16.2.tgz",
252
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.16.2.tgz",
253
- "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.16.2.tgz",
254
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.16.2.tgz",
255
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.16.2.tgz",
256
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.16.2.tgz",
257
- "@tryghost/package-json": "file:components/tryghost-package-json-5.16.2.tgz",
258
- "@tryghost/members-payments": "file:components/tryghost-members-payments-5.16.2.tgz",
259
- "@tryghost/referrers": "file:components/tryghost-referrers-5.16.2.tgz",
260
- "@tryghost/security": "file:components/tryghost-security-5.16.2.tgz",
261
- "@tryghost/session-service": "file:components/tryghost-session-service-5.16.2.tgz",
262
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.16.2.tgz",
263
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.16.2.tgz",
264
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.16.2.tgz",
265
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.16.2.tgz",
266
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.16.2.tgz",
267
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.16.2.tgz",
268
- "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.16.2.tgz"
221
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.17.0.tgz",
222
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.17.0.tgz",
223
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.17.0.tgz",
224
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.17.0.tgz",
225
+ "@tryghost/constants": "file:components/tryghost-constants-5.17.0.tgz",
226
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.17.0.tgz",
227
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.17.0.tgz",
228
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.17.0.tgz",
229
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.17.0.tgz",
230
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.17.0.tgz",
231
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.17.0.tgz",
232
+ "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.17.0.tgz",
233
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.17.0.tgz",
234
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.17.0.tgz",
235
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.17.0.tgz",
236
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.17.0.tgz",
237
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.17.0.tgz",
238
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.17.0.tgz",
239
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.17.0.tgz",
240
+ "@tryghost/member-analytics-service": "file:components/tryghost-member-analytics-service-5.17.0.tgz",
241
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.17.0.tgz",
242
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.17.0.tgz",
243
+ "@tryghost/members-analytics-ingress": "file:components/tryghost-members-analytics-ingress-5.17.0.tgz",
244
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.17.0.tgz",
245
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.17.0.tgz",
246
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.17.0.tgz",
247
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.17.0.tgz",
248
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.17.0.tgz",
249
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.17.0.tgz",
250
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.17.0.tgz",
251
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.17.0.tgz",
252
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.17.0.tgz",
253
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.17.0.tgz",
254
+ "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.17.0.tgz",
255
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.17.0.tgz",
256
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.17.0.tgz",
257
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.17.0.tgz",
258
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.17.0.tgz",
259
+ "@tryghost/members-payments": "file:components/tryghost-members-payments-5.17.0.tgz",
260
+ "@tryghost/referrers": "file:components/tryghost-referrers-5.17.0.tgz",
261
+ "@tryghost/security": "file:components/tryghost-security-5.17.0.tgz",
262
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.17.0.tgz",
263
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.17.0.tgz",
264
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.17.0.tgz",
265
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.17.0.tgz",
266
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.17.0.tgz",
267
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.17.0.tgz",
268
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.17.0.tgz",
269
+ "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.17.0.tgz"
269
270
  }
270
271
  }