ghost 5.15.0 → 5.16.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 (120) hide show
  1. package/components/tryghost-adapter-manager-5.16.0.tgz +0 -0
  2. package/components/{tryghost-api-framework-5.15.0.tgz → tryghost-api-framework-5.16.0.tgz} +0 -0
  3. package/components/{tryghost-api-version-compatibility-service-5.15.0.tgz → tryghost-api-version-compatibility-service-5.16.0.tgz} +0 -0
  4. package/components/tryghost-bootstrap-socket-5.16.0.tgz +0 -0
  5. package/components/{tryghost-constants-5.15.0.tgz → tryghost-constants-5.16.0.tgz} +0 -0
  6. package/components/tryghost-custom-theme-settings-service-5.16.0.tgz +0 -0
  7. package/components/{tryghost-domain-events-5.15.0.tgz → tryghost-domain-events-5.16.0.tgz} +0 -0
  8. package/components/{tryghost-email-analytics-provider-mailgun-5.15.0.tgz → tryghost-email-analytics-provider-mailgun-5.16.0.tgz} +0 -0
  9. package/components/{tryghost-email-analytics-service-5.15.0.tgz → tryghost-email-analytics-service-5.16.0.tgz} +0 -0
  10. package/components/{tryghost-email-content-generator-5.15.0.tgz → tryghost-email-content-generator-5.16.0.tgz} +0 -0
  11. package/components/{tryghost-express-dynamic-redirects-5.15.0.tgz → tryghost-express-dynamic-redirects-5.16.0.tgz} +0 -0
  12. package/components/tryghost-extract-api-key-5.16.0.tgz +0 -0
  13. package/components/{tryghost-html-to-plaintext-5.15.0.tgz → tryghost-html-to-plaintext-5.16.0.tgz} +0 -0
  14. package/components/{tryghost-job-manager-5.15.0.tgz → tryghost-job-manager-5.16.0.tgz} +0 -0
  15. package/components/tryghost-link-redirects-5.16.0.tgz +0 -0
  16. package/components/tryghost-link-replacer-5.16.0.tgz +0 -0
  17. package/components/tryghost-link-tracking-5.16.0.tgz +0 -0
  18. package/components/tryghost-magic-link-5.16.0.tgz +0 -0
  19. package/components/tryghost-mailgun-client-5.16.0.tgz +0 -0
  20. package/components/{tryghost-member-analytics-service-5.15.0.tgz → tryghost-member-analytics-service-5.16.0.tgz} +0 -0
  21. package/components/tryghost-member-attribution-5.16.0.tgz +0 -0
  22. package/components/tryghost-member-events-5.16.0.tgz +0 -0
  23. package/components/{tryghost-members-analytics-ingress-5.15.0.tgz → tryghost-members-analytics-ingress-5.16.0.tgz} +0 -0
  24. package/components/tryghost-members-api-5.16.0.tgz +0 -0
  25. package/components/{tryghost-members-csv-5.15.0.tgz → tryghost-members-csv-5.16.0.tgz} +0 -0
  26. package/components/tryghost-members-events-service-5.16.0.tgz +0 -0
  27. package/components/{tryghost-members-importer-5.15.0.tgz → tryghost-members-importer-5.16.0.tgz} +0 -0
  28. package/components/{tryghost-members-offers-5.15.0.tgz → tryghost-members-offers-5.16.0.tgz} +0 -0
  29. package/components/{tryghost-members-payments-5.15.0.tgz → tryghost-members-payments-5.16.0.tgz} +0 -0
  30. package/components/{tryghost-members-ssr-5.15.0.tgz → tryghost-members-ssr-5.16.0.tgz} +0 -0
  31. package/components/tryghost-members-stripe-service-5.16.0.tgz +0 -0
  32. package/components/tryghost-minifier-5.16.0.tgz +0 -0
  33. package/components/{tryghost-mw-api-version-mismatch-5.15.0.tgz → tryghost-mw-api-version-mismatch-5.16.0.tgz} +0 -0
  34. package/components/{tryghost-mw-cache-control-5.15.0.tgz → tryghost-mw-cache-control-5.16.0.tgz} +0 -0
  35. package/components/{tryghost-mw-error-handler-5.15.0.tgz → tryghost-mw-error-handler-5.16.0.tgz} +0 -0
  36. package/components/tryghost-mw-session-from-token-5.16.0.tgz +0 -0
  37. package/components/tryghost-mw-update-user-last-seen-5.16.0.tgz +0 -0
  38. package/components/tryghost-mw-vhost-5.16.0.tgz +0 -0
  39. package/components/{tryghost-oembed-service-5.15.0.tgz → tryghost-oembed-service-5.16.0.tgz} +0 -0
  40. package/components/{tryghost-package-json-5.15.0.tgz → tryghost-package-json-5.16.0.tgz} +0 -0
  41. package/components/tryghost-referrers-5.16.0.tgz +0 -0
  42. package/components/tryghost-security-5.16.0.tgz +0 -0
  43. package/components/tryghost-session-service-5.16.0.tgz +0 -0
  44. package/components/tryghost-settings-path-manager-5.16.0.tgz +0 -0
  45. package/components/{tryghost-staff-service-5.15.0.tgz → tryghost-staff-service-5.16.0.tgz} +0 -0
  46. package/components/tryghost-stats-service-5.16.0.tgz +0 -0
  47. package/components/tryghost-update-check-service-5.16.0.tgz +0 -0
  48. package/components/{tryghost-verification-trigger-5.15.0.tgz → tryghost-verification-trigger-5.16.0.tgz} +0 -0
  49. package/components/{tryghost-version-notifications-data-service-5.15.0.tgz → tryghost-version-notifications-data-service-5.16.0.tgz} +0 -0
  50. package/core/boot.js +2 -4
  51. package/core/built/admin/assets/{chunk.143.558b9943af7b15f189ae.js → chunk.143.a281d460e6059cd0210a.js} +6 -6
  52. package/core/built/admin/assets/{chunk.178.a9f6ddaea01e2bc76235.js → chunk.178.68eca2346b6f343991e7.js} +4 -4
  53. package/core/built/admin/assets/{chunk.579.dc11bf8dda5cf4406708.js → chunk.579.d14c3688558f34afeb3e.js} +8462 -7944
  54. package/core/built/admin/assets/{chunk.579.dc11bf8dda5cf4406708.js.LICENSE.txt → chunk.579.d14c3688558f34afeb3e.js.LICENSE.txt} +45 -0
  55. package/core/built/admin/assets/ghost-6491d134c450ca676911ea17e16cd7d4.css +1 -0
  56. package/core/built/admin/assets/ghost-dark-297ab2fcf4cadd1c950b84089a38c5e2.css +1 -0
  57. package/core/built/admin/assets/{ghost-4b1b550e34300f5f4774a261aac29557.js → ghost-f2bf99b26aee662cf37fe59f87b1ceb5.js} +259 -194
  58. package/core/built/admin/assets/img/marketing/analytics-1-aa2d72c4e7347a3cb5666d07916b92aa.jpg +0 -0
  59. package/core/built/admin/assets/img/marketing/analytics-2-389d53f80041ff98111cce79facf66b8.jpg +0 -0
  60. package/core/built/admin/assets/{vendor-271c32988ab16ba175a9bfa2acb2887a.js → vendor-b2375e2f383cbc3fd73340c4b656c993.js} +48 -42
  61. package/core/built/admin/index.html +6 -6
  62. package/core/frontend/helpers/search.js +1 -15
  63. package/core/frontend/src/member-attribution/member-attribution.js +38 -4
  64. package/core/server/api/endpoints/index.js +4 -0
  65. package/core/server/api/endpoints/links.js +25 -0
  66. package/core/server/api/endpoints/posts.js +2 -1
  67. package/core/server/api/endpoints/stats.js +24 -0
  68. package/core/server/api/endpoints/utils/serializers/input/posts.js +6 -1
  69. package/core/server/api/endpoints/utils/serializers/output/mappers/activity-feed-events.js +51 -0
  70. package/core/server/api/endpoints/utils/serializers/output/mappers/comments.js +10 -1
  71. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +1 -1
  72. package/core/server/data/exporter/table-lists.js +3 -1
  73. package/core/server/data/migrations/versions/5.16/2022-09-19-09-04-add-link-redirects-table.js +10 -0
  74. package/core/server/data/migrations/versions/5.16/2022-09-19-09-05-add-members-link-click-events-table.js +8 -0
  75. package/core/server/data/migrations/versions/5.16/2022-09-19-17-44-add-referrer-columns-to-member-events-table.js +21 -0
  76. package/core/server/data/migrations/versions/5.16/2022-09-19-17-44-add-referrer-columns-to-subscription-events-table.js +21 -0
  77. package/core/server/data/schema/schema.js +21 -1
  78. package/core/server/models/link-redirect.js +65 -0
  79. package/core/server/models/member-link-click-event.js +26 -0
  80. package/core/server/models/post.js +21 -5
  81. package/core/server/services/bulk-email/bulk-email-processor.js +7 -5
  82. package/core/server/services/link-redirection/LinkRedirectRepository.js +88 -0
  83. package/core/server/services/link-redirection/index.js +9 -11
  84. package/core/server/services/link-tracking/LinkClickRepository.js +69 -0
  85. package/core/server/services/link-tracking/PostLinkRepository.js +62 -0
  86. package/core/server/services/link-tracking/index.js +48 -0
  87. package/core/server/services/mega/post-email-serializer.js +28 -2
  88. package/core/server/services/member-attribution/index.js +12 -5
  89. package/core/server/services/members/api.js +1 -0
  90. package/core/server/web/admin/app.js +8 -2
  91. package/core/server/web/api/endpoints/admin/routes.js +5 -0
  92. package/core/shared/config/defaults.json +5 -5
  93. package/package.json +109 -108
  94. package/yarn.lock +535 -318
  95. package/components/tryghost-adapter-manager-5.15.0.tgz +0 -0
  96. package/components/tryghost-bootstrap-socket-5.15.0.tgz +0 -0
  97. package/components/tryghost-custom-theme-settings-service-5.15.0.tgz +0 -0
  98. package/components/tryghost-extract-api-key-5.15.0.tgz +0 -0
  99. package/components/tryghost-link-redirects-5.15.0.tgz +0 -0
  100. package/components/tryghost-link-replacement-5.15.0.tgz +0 -0
  101. package/components/tryghost-link-tracking-5.15.0.tgz +0 -0
  102. package/components/tryghost-magic-link-5.15.0.tgz +0 -0
  103. package/components/tryghost-mailgun-client-5.15.0.tgz +0 -0
  104. package/components/tryghost-member-attribution-5.15.0.tgz +0 -0
  105. package/components/tryghost-member-events-5.15.0.tgz +0 -0
  106. package/components/tryghost-members-api-5.15.0.tgz +0 -0
  107. package/components/tryghost-members-events-service-5.15.0.tgz +0 -0
  108. package/components/tryghost-members-stripe-service-5.15.0.tgz +0 -0
  109. package/components/tryghost-minifier-5.15.0.tgz +0 -0
  110. package/components/tryghost-mw-session-from-token-5.15.0.tgz +0 -0
  111. package/components/tryghost-mw-update-user-last-seen-5.15.0.tgz +0 -0
  112. package/components/tryghost-mw-vhost-5.15.0.tgz +0 -0
  113. package/components/tryghost-security-5.15.0.tgz +0 -0
  114. package/components/tryghost-session-service-5.15.0.tgz +0 -0
  115. package/components/tryghost-settings-path-manager-5.15.0.tgz +0 -0
  116. package/components/tryghost-update-check-service-5.15.0.tgz +0 -0
  117. package/core/built/admin/assets/ghost-c933adafb359b75ea1577365ce252e76.css +0 -1
  118. package/core/built/admin/assets/ghost-dark-04981c84bf590e0fae0a8e83e018190f.css +0 -1
  119. package/core/server/services/link-click-tracking/index.js +0 -25
  120. package/core/server/services/link-replacement/index.js +0 -24
@@ -0,0 +1,62 @@
1
+ const {FullPostLink} = require('@tryghost/link-tracking');
2
+
3
+ /**
4
+ * @typedef {import('bson-objectid').default} ObjectID
5
+ * @typedef {import('@tryghost/link-tracking/lib/PostLink')} PostLink
6
+ */
7
+
8
+ module.exports = class PostLinkRepository {
9
+ /** @type {Object} */
10
+ #LinkRedirect;
11
+ /** @type {Object} */
12
+ #linkRedirectRepository;
13
+
14
+ /**
15
+ * @param {object} deps
16
+ * @param {object} deps.LinkRedirect Bookshelf Model
17
+ * @param {object} deps.linkRedirectRepository Bookshelf Model
18
+ */
19
+ constructor(deps) {
20
+ this.#LinkRedirect = deps.LinkRedirect;
21
+ this.#linkRedirectRepository = deps.linkRedirectRepository;
22
+ }
23
+
24
+ /**
25
+ *
26
+ * @param {*} options
27
+ * @returns {Promise<InstanceType<FullPostLink>[]>}
28
+ */
29
+ async getAll(options) {
30
+ const collection = await this.#LinkRedirect.findAll({...options, withRelated: ['count.clicks']});
31
+
32
+ const result = [];
33
+
34
+ for (const model of collection.models) {
35
+ const link = this.#linkRedirectRepository.fromModel(model);
36
+
37
+ result.push(
38
+ new FullPostLink({
39
+ post_id: model.get('post_id'),
40
+ link,
41
+ count: {
42
+ clicks: model.get('count__clicks')
43
+ }
44
+ })
45
+ );
46
+ }
47
+
48
+ return result;
49
+ }
50
+
51
+ /**
52
+ * @param {PostLink} postLink
53
+ * @returns {Promise<void>}
54
+ */
55
+ async save(postLink) {
56
+ await this.#LinkRedirect.edit({
57
+ post_id: postLink.post_id.toHexString()
58
+ }, {
59
+ id: postLink.link_id.toHexString()
60
+ });
61
+ }
62
+ };
@@ -0,0 +1,48 @@
1
+ const LinkClickRepository = require('./LinkClickRepository');
2
+ const PostLinkRepository = require('./PostLinkRepository');
3
+ const errors = require('@tryghost/errors');
4
+
5
+ class LinkTrackingServiceWrapper {
6
+ async init() {
7
+ if (this.service) {
8
+ // Already done
9
+ return;
10
+ }
11
+
12
+ const linkRedirection = require('../link-redirection');
13
+ if (!linkRedirection.service) {
14
+ throw new errors.InternalServerError({message: 'LinkRedirectionService should be initialised before LinkTrackingService'});
15
+ }
16
+
17
+ // Wire up all the dependencies
18
+ const models = require('../../models');
19
+ const {MemberLinkClickEvent} = require('@tryghost/member-events');
20
+ const DomainEvents = require('@tryghost/domain-events');
21
+
22
+ const {LinkClickTrackingService} = require('@tryghost/link-tracking');
23
+
24
+ const postLinkRepository = new PostLinkRepository({
25
+ LinkRedirect: models.LinkRedirect,
26
+ linkRedirectRepository: linkRedirection.linkRedirectRepository
27
+ });
28
+
29
+ const linkClickRepository = new LinkClickRepository({
30
+ MemberLinkClickEventModel: models.MemberLinkClickEvent,
31
+ Member: models.Member,
32
+ MemberLinkClickEvent: MemberLinkClickEvent,
33
+ DomainEvents
34
+ });
35
+
36
+ // Expose the service
37
+ this.service = new LinkClickTrackingService({
38
+ linkRedirectService: linkRedirection.service,
39
+ linkClickRepository,
40
+ postLinkRepository,
41
+ DomainEvents
42
+ });
43
+
44
+ await this.service.init();
45
+ }
46
+ }
47
+
48
+ module.exports = new LinkTrackingServiceWrapper();
@@ -14,7 +14,9 @@ const {isUnsplashImage, isLocalContentImage} = require('@tryghost/kg-default-car
14
14
  const {textColorForBackgroundColor, darkenToContrastThreshold} = require('@tryghost/color-utils');
15
15
  const logging = require('@tryghost/logging');
16
16
  const urlService = require('../../services/url');
17
- const linkReplacement = require('../link-replacement');
17
+ const linkReplacer = require('@tryghost/link-replacer');
18
+ const linkTracking = require('../link-tracking');
19
+ const memberAttribution = require('../member-attribution');
18
20
 
19
21
  const ALLOWED_REPLACEMENTS = ['first_name', 'uuid'];
20
22
 
@@ -357,7 +359,31 @@ const PostEmailSerializer = {
357
359
  // Now replace the links in the HTML version
358
360
  if (labs.isSet('emailClicks')) {
359
361
  if ((!options.isBrowserPreview && !options.isTestEmail) || process.env.NODE_ENV === 'development') {
360
- result.html = await linkReplacement.service.replaceLinks(result.html, newsletter, postModel);
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
+ }
382
+
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
+ });
361
387
  }
362
388
  }
363
389
 
@@ -9,20 +9,27 @@ class MemberAttributionServiceWrapper {
9
9
  }
10
10
 
11
11
  // Wire up all the dependencies
12
- const {MemberAttributionService, UrlTranslator, AttributionBuilder} = require('@tryghost/member-attribution');
12
+ const {
13
+ MemberAttributionService, UrlTranslator, ReferrerTranslator, AttributionBuilder
14
+ } = require('@tryghost/member-attribution');
13
15
  const models = require('../../models');
14
16
 
15
17
  const urlTranslator = new UrlTranslator({
16
- urlService,
18
+ urlService,
17
19
  urlUtils,
18
20
  models: {
19
- Post: models.Post,
20
- User: models.User,
21
+ Post: models.Post,
22
+ User: models.User,
21
23
  Tag: models.Tag
22
24
  }
23
25
  });
24
26
 
25
- this.attributionBuilder = new AttributionBuilder({urlTranslator});
27
+ const referrerTranslator = new ReferrerTranslator({
28
+ siteUrl: urlUtils.urlFor('home', true),
29
+ adminUrl: urlUtils.urlFor('admin', true)
30
+ });
31
+
32
+ this.attributionBuilder = new AttributionBuilder({urlTranslator, referrerTranslator});
26
33
 
27
34
  // Expose the service
28
35
  this.service = new MemberAttributionService({
@@ -187,6 +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
191
  OfferRedemption: models.OfferRedemption,
191
192
  Offer: models.Offer,
192
193
  StripeProduct: models.StripeProduct,
@@ -17,9 +17,15 @@ module.exports = function setupAdminApp() {
17
17
  // Admin assets
18
18
  // @TODO ensure this gets a local 404 error handler
19
19
  const configMaxAge = config.get('caching:admin:maxAge');
20
+ // @NOTE: when we start working on HTTP/3 optimizations the immutable headers
21
+ // produced below should be split into separate 'Cache-Control' entry.
22
+ // For reference see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#validation_2
20
23
  adminApp.use('/assets', serveStatic(
21
- path.join(config.get('paths').adminAssets, 'assets'),
22
- {maxAge: (configMaxAge || configMaxAge === 0) ? configMaxAge : constants.ONE_YEAR_MS, fallthrough: false}
24
+ path.join(config.get('paths').adminAssets, 'assets'), {
25
+ maxAge: (configMaxAge || configMaxAge === 0) ? configMaxAge : constants.ONE_YEAR_MS,
26
+ immutable: true,
27
+ fallthrough: false
28
+ }
23
29
  ));
24
30
 
25
31
  adminApp.use('/auth-frame', serveStatic(
@@ -3,6 +3,7 @@ const api = require('../../../../api').endpoints;
3
3
  const {http} = require('@tryghost/api-framework');
4
4
  const apiMw = require('../../middleware');
5
5
  const mw = require('./middleware');
6
+ const labs = require('../../../../../shared/labs');
6
7
 
7
8
  const shared = require('../../../shared');
8
9
 
@@ -134,6 +135,8 @@ module.exports = function apiRoutes() {
134
135
  router.get('/stats/member_count', mw.authAdminApi, http(api.stats.memberCountHistory));
135
136
  router.get('/stats/mrr', mw.authAdminApi, http(api.stats.mrr));
136
137
  router.get('/stats/subscriptions', mw.authAdminApi, http(api.stats.subscriptions));
138
+ router.get('/stats/referrers/posts/:id', mw.authAdminApi, http(api.stats.postReferrers));
139
+ router.get('/stats/referrers', mw.authAdminApi, http(api.stats.referrersHistory));
137
140
 
138
141
  // ## Labels
139
142
  router.get('/labels', mw.authAdminApi, http(api.labels.browse));
@@ -307,5 +310,7 @@ module.exports = function apiRoutes() {
307
310
  router.put('/newsletters/verifications/', mw.authAdminApi, http(api.newsletters.verifyPropertyUpdate));
308
311
  router.put('/newsletters/:id', mw.authAdminApi, http(api.newsletters.edit));
309
312
 
313
+ router.get('/links', labs.enabledMiddleware('emailClicks'), mw.authAdminApi, http(api.links.browse));
314
+
310
315
  return router;
311
316
  };
@@ -139,17 +139,17 @@
139
139
  "emailAnalytics": true
140
140
  },
141
141
  "portal": {
142
- "url": "https://cdn.jsdelivr.net/npm/@tryghost/portal@~{version}/umd/portal.min.js",
142
+ "url": "https://cdn.jsdelivr.net/ghost/portal@~{version}/umd/portal.min.js",
143
143
  "version": "2.12"
144
144
  },
145
145
  "sodoSearch": {
146
- "url": "https://cdn.jsdelivr.net/npm/@tryghost/sodo-search@~{version}/umd/sodo-search.min.js",
147
- "styles": "https://cdn.jsdelivr.net/npm/@tryghost/sodo-search@~{version}/umd/main.css",
146
+ "url": "https://cdn.jsdelivr.net/ghost/sodo-search@~{version}/umd/sodo-search.min.js",
147
+ "styles": "https://cdn.jsdelivr.net/ghost/sodo-search@~{version}/umd/main.css",
148
148
  "version": "1.1"
149
149
  },
150
150
  "comments": {
151
- "url": "https://cdn.jsdelivr.net/npm/@tryghost/comments-ui@~{version}/umd/comments-ui.min.js",
152
- "styles": "https://cdn.jsdelivr.net/npm/@tryghost/comments-ui@~{version}/umd/main.css",
151
+ "url": "https://cdn.jsdelivr.net/ghost/comments-ui@~{version}/umd/comments-ui.min.js",
152
+ "styles": "https://cdn.jsdelivr.net/ghost/comments-ui@~{version}/umd/main.css",
153
153
  "version": "0.10.1"
154
154
  },
155
155
  "editor": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "5.15.0",
3
+ "version": "5.16.0",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -54,75 +54,75 @@
54
54
  "dependencies": {
55
55
  "@sentry/node": "7.13.0",
56
56
  "@tryghost/adapter-base-cache": "0.1.2",
57
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.15.0.tgz",
57
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.16.0.tgz",
58
58
  "@tryghost/admin-api-schema": "4.2.0",
59
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.15.0.tgz",
60
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.15.0.tgz",
61
- "@tryghost/bookshelf-plugins": "0.5.0",
62
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.15.0.tgz",
59
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.16.0.tgz",
60
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.16.0.tgz",
61
+ "@tryghost/bookshelf-plugins": "0.5.1",
62
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.16.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.15.0.tgz",
66
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.15.0.tgz",
67
- "@tryghost/database-info": "0.3.9",
65
+ "@tryghost/constants": "file:components/tryghost-constants-5.16.0.tgz",
66
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.16.0.tgz",
67
+ "@tryghost/database-info": "0.3.10",
68
68
  "@tryghost/debug": "0.1.18",
69
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.15.0.tgz",
70
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.15.0.tgz",
71
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.15.0.tgz",
72
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.15.0.tgz",
73
- "@tryghost/errors": "1.2.15",
74
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.15.0.tgz",
75
- "@tryghost/helpers": "1.1.73",
76
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.15.0.tgz",
69
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.16.0.tgz",
70
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.16.0.tgz",
71
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.16.0.tgz",
72
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.16.0.tgz",
73
+ "@tryghost/errors": "1.2.16",
74
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.16.0.tgz",
75
+ "@tryghost/helpers": "1.1.74",
76
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.16.0.tgz",
77
77
  "@tryghost/image-transform": "1.2.2",
78
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.15.0.tgz",
78
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.16.0.tgz",
79
79
  "@tryghost/kg-card-factory": "3.1.5",
80
80
  "@tryghost/kg-default-atoms": "3.1.4",
81
- "@tryghost/kg-default-cards": "5.18.0",
82
- "@tryghost/kg-lexical-html-renderer": "0.0.2",
81
+ "@tryghost/kg-default-cards": "5.18.2",
82
+ "@tryghost/kg-lexical-html-renderer": "0.0.7",
83
83
  "@tryghost/kg-mobiledoc-html-renderer": "5.3.7",
84
84
  "@tryghost/limit-service": "1.2.3",
85
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.15.0.tgz",
86
- "@tryghost/link-replacement": "file:components/tryghost-link-replacement-5.15.0.tgz",
87
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.15.0.tgz",
88
- "@tryghost/logging": "2.3.0",
89
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.15.0.tgz",
90
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.15.0.tgz",
91
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.15.0.tgz",
92
- "@tryghost/member-events": "file:components/tryghost-member-events-5.15.0.tgz",
93
- "@tryghost/members-api": "file:components/tryghost-members-api-5.15.0.tgz",
94
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.15.0.tgz",
95
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.15.0.tgz",
96
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.15.0.tgz",
97
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.15.0.tgz",
98
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.15.0.tgz",
99
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.15.0.tgz",
100
- "@tryghost/metrics": "1.0.15",
101
- "@tryghost/minifier": "file:components/tryghost-minifier-5.15.0.tgz",
102
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.15.0.tgz",
103
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.15.0.tgz",
104
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.15.0.tgz",
105
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.15.0.tgz",
106
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.15.0.tgz",
107
- "@tryghost/nodemailer": "0.3.25",
85
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.16.0.tgz",
86
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.16.0.tgz",
87
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.16.0.tgz",
88
+ "@tryghost/logging": "2.3.1",
89
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.16.0.tgz",
90
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.16.0.tgz",
91
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.16.0.tgz",
92
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.16.0.tgz",
93
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.16.0.tgz",
94
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.16.0.tgz",
95
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.16.0.tgz",
96
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.16.0.tgz",
97
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.16.0.tgz",
98
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.16.0.tgz",
99
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.16.0.tgz",
100
+ "@tryghost/metrics": "1.0.16",
101
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.16.0.tgz",
102
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.16.0.tgz",
103
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.16.0.tgz",
104
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.16.0.tgz",
105
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.16.0.tgz",
106
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.16.0.tgz",
107
+ "@tryghost/nodemailer": "0.3.27",
108
108
  "@tryghost/nql": "0.9.2",
109
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.15.0.tgz",
110
- "@tryghost/package-json": "file:components/tryghost-package-json-5.15.0.tgz",
109
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.16.0.tgz",
110
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.16.0.tgz",
111
111
  "@tryghost/pretty-cli": "1.2.30",
112
112
  "@tryghost/promise": "0.1.21",
113
- "@tryghost/request": "0.1.29",
114
- "@tryghost/security": "file:components/tryghost-security-5.15.0.tgz",
115
- "@tryghost/session-service": "file:components/tryghost-session-service-5.15.0.tgz",
116
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.15.0.tgz",
113
+ "@tryghost/request": "0.1.30",
114
+ "@tryghost/security": "file:components/tryghost-security-5.16.0.tgz",
115
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.16.0.tgz",
116
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.16.0.tgz",
117
117
  "@tryghost/social-urls": "0.1.33",
118
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.15.0.tgz",
119
- "@tryghost/stats-service": "0.3.0",
118
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.16.0.tgz",
119
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.16.0.tgz",
120
120
  "@tryghost/string": "0.2.1",
121
121
  "@tryghost/tpl": "0.1.18",
122
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.15.0.tgz",
123
- "@tryghost/url-utils": "4.0.3",
124
- "@tryghost/validator": "0.1.27",
125
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.15.0.tgz",
122
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.16.0.tgz",
123
+ "@tryghost/url-utils": "4.2.0",
124
+ "@tryghost/validator": "0.1.28",
125
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.16.0.tgz",
126
126
  "@tryghost/version": "0.1.16",
127
127
  "@tryghost/zip": "1.1.28",
128
128
  "amperize": "0.6.1",
@@ -183,12 +183,12 @@
183
183
  "xml": "1.0.1"
184
184
  },
185
185
  "optionalDependencies": {
186
- "@tryghost/html-to-mobiledoc": "1.8.12",
186
+ "@tryghost/html-to-mobiledoc": "1.8.13",
187
187
  "sqlite3": "5.1.1"
188
188
  },
189
189
  "devDependencies": {
190
- "@playwright/test": "1.25.2",
191
- "@tryghost/express-test": "0.11.3",
190
+ "@playwright/test": "1.26.0",
191
+ "@tryghost/express-test": "0.11.4",
192
192
  "@tryghost/webhook-mock-receiver": "0.1.2",
193
193
  "@types/common-tags": "1.8.1",
194
194
  "c8": "7.12.0",
@@ -197,8 +197,7 @@
197
197
  "eslint": "8.23.1",
198
198
  "grunt": "1.5.3",
199
199
  "grunt-contrib-symlink": "1.0.0",
200
- "grunt-shell": "4.0.0",
201
- "html-validate": "7.4.1",
200
+ "html-validate": "7.5.0",
202
201
  "inquirer": "8.2.4",
203
202
  "jwks-rsa": "2.1.4",
204
203
  "mocha": "10.0.0",
@@ -215,55 +214,57 @@
215
214
  "tmp": "0.2.1"
216
215
  },
217
216
  "resolutions": {
218
- "@tryghost/logging": "2.3.0",
217
+ "@tryghost/logging": "2.3.1",
219
218
  "moment": "2.24.0",
220
219
  "moment-timezone": "0.5.23",
221
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.15.0.tgz",
222
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.15.0.tgz",
223
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.15.0.tgz",
224
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.15.0.tgz",
225
- "@tryghost/constants": "file:components/tryghost-constants-5.15.0.tgz",
226
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.15.0.tgz",
227
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.15.0.tgz",
228
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.15.0.tgz",
229
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.15.0.tgz",
230
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.15.0.tgz",
231
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.15.0.tgz",
232
- "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.15.0.tgz",
233
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.15.0.tgz",
234
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.15.0.tgz",
235
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.15.0.tgz",
236
- "@tryghost/link-replacement": "file:components/tryghost-link-replacement-5.15.0.tgz",
237
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.15.0.tgz",
238
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.15.0.tgz",
239
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.15.0.tgz",
240
- "@tryghost/member-analytics-service": "file:components/tryghost-member-analytics-service-5.15.0.tgz",
241
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.15.0.tgz",
242
- "@tryghost/member-events": "file:components/tryghost-member-events-5.15.0.tgz",
243
- "@tryghost/members-analytics-ingress": "file:components/tryghost-members-analytics-ingress-5.15.0.tgz",
244
- "@tryghost/members-api": "file:components/tryghost-members-api-5.15.0.tgz",
245
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.15.0.tgz",
246
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.15.0.tgz",
247
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.15.0.tgz",
248
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.15.0.tgz",
249
- "@tryghost/minifier": "file:components/tryghost-minifier-5.15.0.tgz",
250
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.15.0.tgz",
251
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.15.0.tgz",
252
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.15.0.tgz",
253
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.15.0.tgz",
254
- "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.15.0.tgz",
255
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.15.0.tgz",
256
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.15.0.tgz",
257
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.15.0.tgz",
258
- "@tryghost/package-json": "file:components/tryghost-package-json-5.15.0.tgz",
259
- "@tryghost/members-payments": "file:components/tryghost-members-payments-5.15.0.tgz",
260
- "@tryghost/security": "file:components/tryghost-security-5.15.0.tgz",
261
- "@tryghost/session-service": "file:components/tryghost-session-service-5.15.0.tgz",
262
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.15.0.tgz",
263
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.15.0.tgz",
264
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.15.0.tgz",
265
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.15.0.tgz",
266
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.15.0.tgz",
267
- "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.15.0.tgz"
220
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.16.0.tgz",
221
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.16.0.tgz",
222
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.16.0.tgz",
223
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.16.0.tgz",
224
+ "@tryghost/constants": "file:components/tryghost-constants-5.16.0.tgz",
225
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.16.0.tgz",
226
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.16.0.tgz",
227
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.16.0.tgz",
228
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.16.0.tgz",
229
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.16.0.tgz",
230
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.16.0.tgz",
231
+ "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.16.0.tgz",
232
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.16.0.tgz",
233
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.16.0.tgz",
234
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.16.0.tgz",
235
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.16.0.tgz",
236
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.16.0.tgz",
237
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.16.0.tgz",
238
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.16.0.tgz",
239
+ "@tryghost/member-analytics-service": "file:components/tryghost-member-analytics-service-5.16.0.tgz",
240
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.16.0.tgz",
241
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.16.0.tgz",
242
+ "@tryghost/members-analytics-ingress": "file:components/tryghost-members-analytics-ingress-5.16.0.tgz",
243
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.16.0.tgz",
244
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.16.0.tgz",
245
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.16.0.tgz",
246
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.16.0.tgz",
247
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.16.0.tgz",
248
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.16.0.tgz",
249
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.16.0.tgz",
250
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.16.0.tgz",
251
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.16.0.tgz",
252
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.16.0.tgz",
253
+ "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.16.0.tgz",
254
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.16.0.tgz",
255
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.16.0.tgz",
256
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.16.0.tgz",
257
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.16.0.tgz",
258
+ "@tryghost/members-payments": "file:components/tryghost-members-payments-5.16.0.tgz",
259
+ "@tryghost/referrers": "file:components/tryghost-referrers-5.16.0.tgz",
260
+ "@tryghost/security": "file:components/tryghost-security-5.16.0.tgz",
261
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.16.0.tgz",
262
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.16.0.tgz",
263
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.16.0.tgz",
264
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.16.0.tgz",
265
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.16.0.tgz",
266
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.16.0.tgz",
267
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.16.0.tgz",
268
+ "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.16.0.tgz"
268
269
  }
269
270
  }