ghost 5.22.10 → 5.23.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/.c8rc.e2e.json +21 -0
  2. package/README.md +0 -2
  3. package/components/tryghost-adapter-manager-5.23.0.tgz +0 -0
  4. package/components/tryghost-api-framework-5.23.0.tgz +0 -0
  5. package/components/tryghost-api-version-compatibility-service-5.23.0.tgz +0 -0
  6. package/components/{tryghost-audience-feedback-5.22.10.tgz → tryghost-audience-feedback-5.23.0.tgz} +0 -0
  7. package/components/tryghost-bootstrap-socket-5.23.0.tgz +0 -0
  8. package/components/tryghost-constants-5.23.0.tgz +0 -0
  9. package/components/tryghost-custom-theme-settings-service-5.23.0.tgz +0 -0
  10. package/components/tryghost-data-generator-5.23.0.tgz +0 -0
  11. package/components/tryghost-domain-events-5.23.0.tgz +0 -0
  12. package/components/tryghost-email-analytics-provider-mailgun-5.23.0.tgz +0 -0
  13. package/components/tryghost-email-analytics-service-5.23.0.tgz +0 -0
  14. package/components/tryghost-email-content-generator-5.23.0.tgz +0 -0
  15. package/components/tryghost-email-suppression-list-5.23.0.tgz +0 -0
  16. package/components/tryghost-express-dynamic-redirects-5.23.0.tgz +0 -0
  17. package/components/tryghost-extract-api-key-5.23.0.tgz +0 -0
  18. package/components/tryghost-html-to-plaintext-5.23.0.tgz +0 -0
  19. package/components/{tryghost-job-manager-5.22.10.tgz → tryghost-job-manager-5.23.0.tgz} +0 -0
  20. package/components/tryghost-link-redirects-5.23.0.tgz +0 -0
  21. package/components/tryghost-link-replacer-5.23.0.tgz +0 -0
  22. package/components/tryghost-link-tracking-5.23.0.tgz +0 -0
  23. package/components/{tryghost-magic-link-5.22.10.tgz → tryghost-magic-link-5.23.0.tgz} +0 -0
  24. package/components/tryghost-mailgun-client-5.23.0.tgz +0 -0
  25. package/components/{tryghost-member-attribution-5.22.10.tgz → tryghost-member-attribution-5.23.0.tgz} +0 -0
  26. package/components/tryghost-member-events-5.23.0.tgz +0 -0
  27. package/components/tryghost-members-api-5.23.0.tgz +0 -0
  28. package/components/tryghost-members-csv-5.23.0.tgz +0 -0
  29. package/components/tryghost-members-events-service-5.23.0.tgz +0 -0
  30. package/components/tryghost-members-importer-5.23.0.tgz +0 -0
  31. package/components/{tryghost-members-offers-5.22.10.tgz → tryghost-members-offers-5.23.0.tgz} +0 -0
  32. package/components/tryghost-members-payments-5.23.0.tgz +0 -0
  33. package/components/tryghost-members-ssr-5.23.0.tgz +0 -0
  34. package/components/tryghost-members-stripe-service-5.23.0.tgz +0 -0
  35. package/components/tryghost-minifier-5.23.0.tgz +0 -0
  36. package/components/tryghost-mw-api-version-mismatch-5.23.0.tgz +0 -0
  37. package/components/tryghost-mw-cache-control-5.23.0.tgz +0 -0
  38. package/components/{tryghost-mw-error-handler-5.22.10.tgz → tryghost-mw-error-handler-5.23.0.tgz} +0 -0
  39. package/components/tryghost-mw-session-from-token-5.23.0.tgz +0 -0
  40. package/components/tryghost-mw-update-user-last-seen-5.23.0.tgz +0 -0
  41. package/components/tryghost-mw-vhost-5.23.0.tgz +0 -0
  42. package/components/tryghost-oembed-service-5.23.0.tgz +0 -0
  43. package/components/tryghost-package-json-5.23.0.tgz +0 -0
  44. package/components/tryghost-referrers-5.23.0.tgz +0 -0
  45. package/components/tryghost-security-5.23.0.tgz +0 -0
  46. package/components/tryghost-session-service-5.23.0.tgz +0 -0
  47. package/components/tryghost-settings-path-manager-5.23.0.tgz +0 -0
  48. package/components/{tryghost-staff-service-5.22.10.tgz → tryghost-staff-service-5.23.0.tgz} +0 -0
  49. package/components/{tryghost-stats-service-5.22.10.tgz → tryghost-stats-service-5.23.0.tgz} +0 -0
  50. package/components/{tryghost-tiers-5.22.10.tgz → tryghost-tiers-5.23.0.tgz} +0 -0
  51. package/components/tryghost-update-check-service-5.23.0.tgz +0 -0
  52. package/components/tryghost-verification-trigger-5.23.0.tgz +0 -0
  53. package/components/tryghost-version-notifications-data-service-5.23.0.tgz +0 -0
  54. package/content/themes/casper/assets/built/screen.css +1 -1
  55. package/content/themes/casper/assets/built/screen.css.map +1 -1
  56. package/content/themes/casper/assets/css/screen.css +3 -5
  57. package/content/themes/casper/default.hbs +2 -2
  58. package/content/themes/casper/package.json +1 -1
  59. package/core/boot.js +3 -1
  60. package/core/built/admin/assets/{chunk.143.efc32dbcc893663c95cb.js → chunk.143.3dccaccd501e94a38af6.js} +5 -5
  61. package/core/built/admin/assets/{chunk.178.95a503a229a8fd49e91e.js → chunk.178.f3466350ec3bacc7baa6.js} +4 -4
  62. package/core/built/admin/assets/{ghost-b204dcc6ad523053868da9b2d8d65f80.js → ghost-64c5f32d4052347eed1ae73909b526ef.js} +1240 -1202
  63. package/core/built/admin/assets/ghost-bbf3150c788d19852f14fc518b8ebb93.css +1 -0
  64. package/core/built/admin/assets/ghost-dark-681daaaef962911f5bcfdd51d7b4efdd.css +1 -0
  65. package/core/built/admin/assets/{vendor-dc9f883b3468ff84794cf13741e6c4b4.js → vendor-45c4a02c5360deeb66a0438a8bc7c18e.js} +42 -38
  66. package/core/built/admin/index.html +5 -5
  67. package/core/frontend/apps/amp/lib/helpers/amp_content.js +1 -1
  68. package/core/frontend/apps/amp/lib/views/amp.hbs +10 -0
  69. package/core/frontend/helpers/ghost_head.js +1 -7
  70. package/core/server/api/endpoints/db.js +17 -11
  71. package/core/server/api/endpoints/posts.js +4 -1
  72. package/core/server/api/endpoints/utils/serializers/input/posts.js +4 -11
  73. package/core/server/api/endpoints/utils/serializers/output/db.js +3 -7
  74. package/core/server/api/endpoints/utils/serializers/output/members.js +5 -0
  75. package/core/server/data/importer/email-template.js +163 -0
  76. package/core/server/data/importer/import-manager.js +115 -35
  77. package/core/server/data/importer/importers/data/base.js +1 -0
  78. package/core/server/data/importer/importers/data/data-importer.js +27 -1
  79. package/core/server/data/schema/default-settings/default-settings.json +1 -1
  80. package/core/server/models/base/plugins/bulk-operations.js +0 -1
  81. package/core/server/models/comment.js +1 -1
  82. package/core/server/models/member-newsletter.js +9 -0
  83. package/core/server/models/member.js +1 -9
  84. package/core/server/models/stripe-customer-subscription.js +3 -7
  85. package/core/server/services/bulk-email/bulk-email-processor.js +14 -23
  86. package/core/server/services/email-suppression-list/index.js +1 -0
  87. package/core/server/services/email-suppression-list/service.js +32 -0
  88. package/core/server/services/mega/mega.js +50 -5
  89. package/core/server/services/mega/segment-parser.js +1 -3
  90. package/core/server/services/members/api.js +4 -2
  91. package/core/server/services/members/middleware.js +1 -1
  92. package/core/server/services/members/service.js +35 -28
  93. package/core/server/web/members/app.js +0 -1
  94. package/core/shared/config/defaults.json +1 -1
  95. package/core/shared/labs.js +3 -7
  96. package/package.json +103 -101
  97. package/playwright.config.js +15 -0
  98. package/yarn.lock +75 -130
  99. package/components/tryghost-adapter-manager-5.22.10.tgz +0 -0
  100. package/components/tryghost-api-framework-5.22.10.tgz +0 -0
  101. package/components/tryghost-api-version-compatibility-service-5.22.10.tgz +0 -0
  102. package/components/tryghost-bootstrap-socket-5.22.10.tgz +0 -0
  103. package/components/tryghost-constants-5.22.10.tgz +0 -0
  104. package/components/tryghost-custom-theme-settings-service-5.22.10.tgz +0 -0
  105. package/components/tryghost-data-generator-5.22.10.tgz +0 -0
  106. package/components/tryghost-domain-events-5.22.10.tgz +0 -0
  107. package/components/tryghost-email-analytics-provider-mailgun-5.22.10.tgz +0 -0
  108. package/components/tryghost-email-analytics-service-5.22.10.tgz +0 -0
  109. package/components/tryghost-email-content-generator-5.22.10.tgz +0 -0
  110. package/components/tryghost-express-dynamic-redirects-5.22.10.tgz +0 -0
  111. package/components/tryghost-extract-api-key-5.22.10.tgz +0 -0
  112. package/components/tryghost-html-to-plaintext-5.22.10.tgz +0 -0
  113. package/components/tryghost-link-redirects-5.22.10.tgz +0 -0
  114. package/components/tryghost-link-replacer-5.22.10.tgz +0 -0
  115. package/components/tryghost-link-tracking-5.22.10.tgz +0 -0
  116. package/components/tryghost-mailgun-client-5.22.10.tgz +0 -0
  117. package/components/tryghost-member-analytics-service-5.22.10.tgz +0 -0
  118. package/components/tryghost-member-events-5.22.10.tgz +0 -0
  119. package/components/tryghost-members-analytics-ingress-5.22.10.tgz +0 -0
  120. package/components/tryghost-members-api-5.22.10.tgz +0 -0
  121. package/components/tryghost-members-csv-5.22.10.tgz +0 -0
  122. package/components/tryghost-members-events-service-5.22.10.tgz +0 -0
  123. package/components/tryghost-members-importer-5.22.10.tgz +0 -0
  124. package/components/tryghost-members-payments-5.22.10.tgz +0 -0
  125. package/components/tryghost-members-ssr-5.22.10.tgz +0 -0
  126. package/components/tryghost-members-stripe-service-5.22.10.tgz +0 -0
  127. package/components/tryghost-minifier-5.22.10.tgz +0 -0
  128. package/components/tryghost-mw-api-version-mismatch-5.22.10.tgz +0 -0
  129. package/components/tryghost-mw-cache-control-5.22.10.tgz +0 -0
  130. package/components/tryghost-mw-session-from-token-5.22.10.tgz +0 -0
  131. package/components/tryghost-mw-update-user-last-seen-5.22.10.tgz +0 -0
  132. package/components/tryghost-mw-vhost-5.22.10.tgz +0 -0
  133. package/components/tryghost-oembed-service-5.22.10.tgz +0 -0
  134. package/components/tryghost-package-json-5.22.10.tgz +0 -0
  135. package/components/tryghost-referrers-5.22.10.tgz +0 -0
  136. package/components/tryghost-security-5.22.10.tgz +0 -0
  137. package/components/tryghost-session-service-5.22.10.tgz +0 -0
  138. package/components/tryghost-settings-path-manager-5.22.10.tgz +0 -0
  139. package/components/tryghost-update-check-service-5.22.10.tgz +0 -0
  140. package/components/tryghost-verification-trigger-5.22.10.tgz +0 -0
  141. package/components/tryghost-version-notifications-data-service-5.22.10.tgz +0 -0
  142. package/core/built/admin/assets/ghost-03c7a25d23ad4d0725da171f8d7c7b2a.css +0 -1
  143. package/core/built/admin/assets/ghost-dark-8896a076fc06ec2b09343b1c9df7feca.css +0 -1
  144. package/core/server/models/member-analytic-event.js +0 -9
@@ -283,13 +283,14 @@ async function pendingEmailHandler(emailModel, options) {
283
283
  if (!process.env.NODE_ENV.startsWith('test')) {
284
284
  return jobsService.addJob({
285
285
  job: sendEmailJob,
286
- data: {emailModel},
286
+ data: {emailId: emailModel.id},
287
287
  offloaded: false
288
288
  });
289
289
  }
290
290
  }
291
291
 
292
- async function sendEmailJob({emailModel, options}) {
292
+ async function sendEmailJob({emailId, options}) {
293
+ logging.info('[sendEmailJob] Started for ' + emailId);
293
294
  let startEmailSend = null;
294
295
 
295
296
  try {
@@ -304,10 +305,45 @@ async function sendEmailJob({emailModel, options}) {
304
305
  await limitService.errorIfWouldGoOverLimit('emails');
305
306
  }
306
307
 
308
+ // Check if the email is still pending. And set the status to submitting in one transaction.
309
+ let hasSingleAccess = false;
310
+ let emailModel;
311
+ await models.Base.transaction(async (transacting) => {
312
+ const knexOptions = {...options, transacting, forUpdate: true};
313
+ emailModel = await models.Email.findOne({id: emailId}, knexOptions);
314
+
315
+ if (!emailModel) {
316
+ throw new errors.IncorrectUsageError({
317
+ message: 'Provided email id does not match a known email record',
318
+ context: {
319
+ id: emailId
320
+ }
321
+ });
322
+ }
323
+
324
+ if (emailModel.get('status') !== 'pending') {
325
+ // We don't throw this, because we don't want to mark this email as failed
326
+ logging.error(new errors.IncorrectUsageError({
327
+ message: 'Emails can only be processed when in the "pending" state',
328
+ context: `Email "${emailId}" has state "${emailModel.get('status')}"`,
329
+ code: 'EMAIL_NOT_PENDING'
330
+ }));
331
+ return;
332
+ }
333
+
334
+ await emailModel.save({status: 'submitting'}, Object.assign({}, knexOptions, {patch: true}));
335
+ hasSingleAccess = true;
336
+ });
337
+
338
+ if (!hasSingleAccess || !emailModel) {
339
+ return;
340
+ }
341
+
307
342
  // Create email batch and recipient rows unless this is a retry and they already exist
308
343
  const existingBatchCount = await emailModel.related('emailBatches').count('id');
309
344
 
310
345
  if (existingBatchCount === 0) {
346
+ logging.info('[sendEmailJob] Creating new batches for ' + emailId);
311
347
  let newBatchCount = 0;
312
348
 
313
349
  await models.Base.transaction(async (transacting) => {
@@ -316,15 +352,23 @@ async function sendEmailJob({emailModel, options}) {
316
352
  });
317
353
 
318
354
  if (newBatchCount === 0) {
355
+ logging.info('[sendEmailJob] No batches created for ' + emailId);
356
+ await emailModel.save({status: 'submitted'}, {patch: true});
319
357
  return;
320
358
  }
321
359
  }
322
360
 
323
361
  debug('sendEmailJob: sending email');
324
362
  startEmailSend = Date.now();
325
- await bulkEmailService.processEmail({emailId: emailModel.get('id'), options});
363
+ await bulkEmailService.processEmail({emailModel, options});
326
364
  debug(`sendEmailJob: sent email (${Date.now() - startEmailSend}ms)`);
327
365
  } catch (error) {
366
+ if (startEmailSend) {
367
+ logging.info(`[sendEmailJob] Failed sending ${emailId} (${Date.now() - startEmailSend}ms)`);
368
+ } else {
369
+ logging.info(`[sendEmailJob] Failed sending ${emailId}`);
370
+ }
371
+
328
372
  if (startEmailSend) {
329
373
  debug(`sendEmailJob: send email failed (${Date.now() - startEmailSend}ms)`);
330
374
  }
@@ -334,10 +378,10 @@ async function sendEmailJob({emailModel, options}) {
334
378
  errorMessage = errorMessage.substring(0, 2000);
335
379
  }
336
380
 
337
- await emailModel.save({
381
+ await models.Email.edit({
338
382
  status: 'failed',
339
383
  error: errorMessage
340
- }, {patch: true});
384
+ }, {id: emailId});
341
385
 
342
386
  throw new errors.InternalServerError({
343
387
  err: error,
@@ -514,6 +558,7 @@ async function createEmailBatches({emailModel, memberRows, memberSegment, option
514
558
  const batches = _.chunk(memberRows, bulkEmailService.BATCH_SIZE);
515
559
  const batchIds = await Promise.mapSeries(batches, storeRecipientBatch);
516
560
  debug(`createEmailBatches: stored recipient list (${Date.now() - startOfRecipientStorage}ms)`);
561
+ logging.info(`[createEmailBatches] stored recipient list (${Date.now() - startOfRecipientStorage}ms)`);
517
562
 
518
563
  return batchIds;
519
564
  }
@@ -1,5 +1,3 @@
1
- const labs = require('../../../shared/labs');
2
-
3
1
  const getSegmentsFromHtml = (html) => {
4
2
  const cheerio = require('cheerio');
5
3
  const $ = cheerio.load(html);
@@ -11,7 +9,7 @@ const getSegmentsFromHtml = (html) => {
11
9
  /**
12
10
  * Always add free and paid segments if email has paywall card
13
11
  */
14
- if (labs.isSet('newsletterPaywall') && html.indexOf('<!--members-only-->') !== -1) {
12
+ if (html.indexOf('<!--members-only-->') !== -1) {
15
13
  allSegments = allSegments.concat(['status:free', 'status:-free']);
16
14
  }
17
15
 
@@ -16,6 +16,7 @@ const offersService = require('../offers');
16
16
  const tiersService = require('../tiers');
17
17
  const newslettersService = require('../newsletters');
18
18
  const memberAttributionService = require('../member-attribution');
19
+ const emailSuppressionList = require('../email-suppression-list');
19
20
 
20
21
  const MAGIC_LINK_TOKEN_VALIDITY = 24 * 60 * 60 * 1000;
21
22
 
@@ -177,6 +178,7 @@ function createApiInstance(config) {
177
178
  StripeCustomer: models.MemberStripeCustomer,
178
179
  StripeCustomerSubscription: models.StripeCustomerSubscription,
179
180
  Member: models.Member,
181
+ MemberNewsletter: models.MemberNewsletter,
180
182
  MemberCancelEvent: models.MemberCancelEvent,
181
183
  MemberSubscribeEvent: models.MemberSubscribeEvent,
182
184
  MemberPaidSubscriptionEvent: models.MemberPaidSubscriptionEvent,
@@ -185,7 +187,6 @@ function createApiInstance(config) {
185
187
  MemberPaymentEvent: models.MemberPaymentEvent,
186
188
  MemberStatusEvent: models.MemberStatusEvent,
187
189
  MemberProductEvent: models.MemberProductEvent,
188
- MemberAnalyticEvent: models.MemberAnalyticEvent,
189
190
  MemberCreatedEvent: models.MemberCreatedEvent,
190
191
  SubscriptionCreatedEvent: models.SubscriptionCreatedEvent,
191
192
  MemberLinkClickEvent: models.MemberClickEvent,
@@ -203,7 +204,8 @@ function createApiInstance(config) {
203
204
  offersAPI: offersService.api,
204
205
  labsService: labsService,
205
206
  newslettersService: newslettersService,
206
- memberAttributionService: memberAttributionService.service
207
+ memberAttributionService: memberAttributionService.service,
208
+ emailSuppressionList
207
209
  });
208
210
 
209
211
  return membersApiInstance;
@@ -29,7 +29,7 @@ const loadMemberSession = async function (req, res, next) {
29
29
 
30
30
  /**
31
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.
32
+ * You can chain this after loadMemberSession to make it possible to authenticate via both the uuid and the session.
33
33
  */
34
34
  const authMemberByUuid = async function (req, res, next) {
35
35
  try {
@@ -74,6 +74,36 @@ const processImport = async (options) => {
74
74
  return result;
75
75
  };
76
76
 
77
+ const updateVerificationTrigger = () => {
78
+ verificationTrigger = new VerificationTrigger({
79
+ apiTriggerThreshold: _.get(config.get('hostSettings'), 'emailVerification.apiThreshold'),
80
+ adminTriggerThreshold: _.get(config.get('hostSettings'), 'emailVerification.adminThreshold'),
81
+ importTriggerThreshold: _.get(config.get('hostSettings'), 'emailVerification.importThreshold'),
82
+ isVerified: () => config.get('hostSettings:emailVerification:verified') === true,
83
+ isVerificationRequired: () => settingsCache.get('email_verification_required') === true,
84
+ sendVerificationEmail: async ({subject, message, amountTriggered}) => {
85
+ const escalationAddress = config.get('hostSettings:emailVerification:escalationAddress');
86
+ const fromAddress = config.get('user_email');
87
+
88
+ if (escalationAddress) {
89
+ await ghostMailer.send({
90
+ subject,
91
+ html: tpl(message, {
92
+ amountTriggered: amountTriggered,
93
+ siteUrl: urlUtils.getSiteUrl()
94
+ }),
95
+ forceTextContent: true,
96
+ from: fromAddress,
97
+ to: escalationAddress
98
+ });
99
+ }
100
+ },
101
+ membersStats,
102
+ Settings: models.Settings,
103
+ eventRepository: membersApi.events
104
+ });
105
+ };
106
+
77
107
  module.exports = {
78
108
  async init() {
79
109
  const stripeService = require('../stripe');
@@ -110,33 +140,7 @@ module.exports = {
110
140
  getMembersApi: () => module.exports.api
111
141
  });
112
142
 
113
- verificationTrigger = new VerificationTrigger({
114
- apiTriggerThreshold: _.get(config.get('hostSettings'), 'emailVerification.apiThreshold'),
115
- adminTriggerThreshold: _.get(config.get('hostSettings'), 'emailVerification.adminThreshold'),
116
- importTriggerThreshold: _.get(config.get('hostSettings'), 'emailVerification.importThreshold'),
117
- isVerified: () => config.get('hostSettings:emailVerification:verified') === true,
118
- isVerificationRequired: () => settingsCache.get('email_verification_required') === true,
119
- sendVerificationEmail: ({subject, message, amountTriggered}) => {
120
- const escalationAddress = config.get('hostSettings:emailVerification:escalationAddress');
121
- const fromAddress = config.get('user_email');
122
-
123
- if (escalationAddress) {
124
- ghostMailer.send({
125
- subject,
126
- html: tpl(message, {
127
- amountTriggered: amountTriggered,
128
- siteUrl: urlUtils.getSiteUrl()
129
- }),
130
- forceTextContent: true,
131
- from: fromAddress,
132
- to: escalationAddress
133
- });
134
- }
135
- },
136
- membersStats,
137
- Settings: models.Settings,
138
- eventRepository: membersApi.events
139
- });
143
+ updateVerificationTrigger();
140
144
 
141
145
  (async () => {
142
146
  try {
@@ -185,7 +189,10 @@ module.exports = {
185
189
  processImport: processImport,
186
190
 
187
191
  stats: membersStats,
188
- export: require('./exporter/query')
192
+ export: require('./exporter/query'),
193
+
194
+ // Only for tests
195
+ _updateVerificationTrigger: updateVerificationTrigger
189
196
  };
190
197
 
191
198
  module.exports.middleware = require('./middleware');
@@ -62,7 +62,6 @@ module.exports = function setupMembersApp() {
62
62
  membersApp.post('/api/create-stripe-checkout-session', (req, res, next) => membersService.api.middleware.createCheckoutSession(req, res, next));
63
63
  membersApp.post('/api/create-stripe-update-session', (req, res, next) => membersService.api.middleware.createCheckoutSetupSession(req, res, next));
64
64
  membersApp.put('/api/subscriptions/:id', (req, res, next) => membersService.api.middleware.updateSubscription(req, res, next));
65
- membersApp.post('/api/events', labs.enabledMiddleware('membersActivity'), middleware.loadMemberSession, (req, res, next) => membersService.api.middleware.createEvents(req, res, next));
66
65
 
67
66
  // Comments
68
67
  membersApp.use('/api/comments', commentRouter());
@@ -161,7 +161,7 @@
161
161
  },
162
162
  "portal": {
163
163
  "url": "https://cdn.jsdelivr.net/ghost/portal@~{version}/umd/portal.min.js",
164
- "version": "2.19"
164
+ "version": "2.20"
165
165
  },
166
166
  "sodoSearch": {
167
167
  "url": "https://cdn.jsdelivr.net/ghost/sodo-search@~{version}/umd/sodo-search.min.js",
@@ -15,12 +15,6 @@ const messages = {
15
15
 
16
16
  // flags in this list always return `true`, allows quick global enable prior to full flag removal
17
17
  const GA_FEATURES = [
18
- 'newsletterPaywall',
19
- 'freeTrial',
20
- 'compExpiring',
21
- 'searchHelper',
22
- 'emailAlerts',
23
- 'fixNewsletterLinks',
24
18
  'sourceAttribution',
25
19
  'memberAttribution',
26
20
  'audienceFeedback'
@@ -35,7 +29,9 @@ const BETA_FEATURES = [
35
29
  const ALPHA_FEATURES = [
36
30
  'urlCache',
37
31
  'beforeAfterCard',
38
- 'lexicalEditor'
32
+ 'lexicalEditor',
33
+ 'suppressionList',
34
+ 'emailStability'
39
35
  ];
40
36
 
41
37
  module.exports.GA_KEYS = [...GA_FEATURES];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "5.22.10",
3
+ "version": "5.23.0",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -32,8 +32,10 @@
32
32
  "test:integration": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/integration' --timeout=10000",
33
33
  "test:e2e": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/e2e-api' './test/e2e-frontend' './test/e2e-server' './test/e2e-webhooks' --timeout=15000",
34
34
  "test:regression": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/regression' --timeout=60000",
35
- "test:browser": "playwright test --browser=all test/e2e-browser",
36
- "test:ci": "yarn test:e2e -b && yarn test:integration -b && yarn test:regression -b",
35
+ "test:browser": "NODE_ENV=testing playwright test --browser=all test/e2e-browser",
36
+ "test:browser:start": "node test/e2e-browser/bin/ghost",
37
+ "test:ci": "c8 -c ./.c8rc.e2e.json yarn test:ci:base",
38
+ "test:ci:base": "yarn test:e2e -b",
37
39
  "test:unit:slow": "yarn test:unit --reporter=mocha-slow-test-reporter",
38
40
  "test:int:slow": "yarn test:integration --reporter=mocha-slow-test-reporter",
39
41
  "test:e2e:slow": "yarn test:e2e --reporter=mocha-slow-test-reporter",
@@ -54,79 +56,80 @@
54
56
  "dependencies": {
55
57
  "@sentry/node": "7.15.0",
56
58
  "@tryghost/adapter-base-cache": "0.1.2",
57
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.22.10.tgz",
59
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.23.0.tgz",
58
60
  "@tryghost/admin-api-schema": "4.2.0",
59
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.22.10.tgz",
60
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.22.10.tgz",
61
- "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.22.10.tgz",
61
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.23.0.tgz",
62
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.23.0.tgz",
63
+ "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.23.0.tgz",
62
64
  "@tryghost/bookshelf-plugins": "0.6.1",
63
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.22.10.tgz",
65
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.23.0.tgz",
64
66
  "@tryghost/color-utils": "0.1.21",
65
67
  "@tryghost/config-url-helpers": "1.0.3",
66
- "@tryghost/constants": "file:components/tryghost-constants-5.22.10.tgz",
67
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.22.10.tgz",
68
- "@tryghost/data-generator": "file:components/tryghost-data-generator-5.22.10.tgz",
68
+ "@tryghost/constants": "file:components/tryghost-constants-5.23.0.tgz",
69
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.23.0.tgz",
70
+ "@tryghost/data-generator": "file:components/tryghost-data-generator-5.23.0.tgz",
69
71
  "@tryghost/database-info": "0.3.12",
70
72
  "@tryghost/debug": "0.1.19",
71
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.22.10.tgz",
72
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.22.10.tgz",
73
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.22.10.tgz",
74
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.22.10.tgz",
73
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.23.0.tgz",
74
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.23.0.tgz",
75
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.23.0.tgz",
76
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.23.0.tgz",
77
+ "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.23.0.tgz",
75
78
  "@tryghost/errors": "1.2.18",
76
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.22.10.tgz",
79
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.23.0.tgz",
77
80
  "@tryghost/helpers": "1.1.74",
78
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.22.10.tgz",
81
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.23.0.tgz",
79
82
  "@tryghost/http-cache-utils": "0.1.4",
80
83
  "@tryghost/image-transform": "1.2.2",
81
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.22.10.tgz",
84
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.23.0.tgz",
82
85
  "@tryghost/kg-card-factory": "3.1.7",
83
86
  "@tryghost/kg-default-atoms": "3.1.4",
84
87
  "@tryghost/kg-default-cards": "5.18.5",
85
88
  "@tryghost/kg-lexical-html-renderer": "0.0.11",
86
89
  "@tryghost/kg-mobiledoc-html-renderer": "5.3.9",
87
90
  "@tryghost/limit-service": "1.2.3",
88
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.22.10.tgz",
89
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.22.10.tgz",
90
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.22.10.tgz",
91
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.23.0.tgz",
92
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.23.0.tgz",
93
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.23.0.tgz",
91
94
  "@tryghost/logging": "2.3.2",
92
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.22.10.tgz",
93
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.22.10.tgz",
94
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.22.10.tgz",
95
- "@tryghost/member-events": "file:components/tryghost-member-events-5.22.10.tgz",
96
- "@tryghost/members-api": "file:components/tryghost-members-api-5.22.10.tgz",
97
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.22.10.tgz",
98
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.22.10.tgz",
99
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.22.10.tgz",
100
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.22.10.tgz",
101
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.22.10.tgz",
102
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.22.10.tgz",
95
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.23.0.tgz",
96
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.23.0.tgz",
97
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.23.0.tgz",
98
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.23.0.tgz",
99
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.23.0.tgz",
100
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.23.0.tgz",
101
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.23.0.tgz",
102
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.23.0.tgz",
103
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.23.0.tgz",
104
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.23.0.tgz",
105
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.23.0.tgz",
103
106
  "@tryghost/metrics": "1.0.16",
104
- "@tryghost/minifier": "file:components/tryghost-minifier-5.22.10.tgz",
105
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.22.10.tgz",
106
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.22.10.tgz",
107
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.22.10.tgz",
108
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.22.10.tgz",
109
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.22.10.tgz",
107
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.23.0.tgz",
108
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.23.0.tgz",
109
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.23.0.tgz",
110
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.23.0.tgz",
111
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.23.0.tgz",
112
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.23.0.tgz",
110
113
  "@tryghost/nodemailer": "0.3.29",
111
114
  "@tryghost/nql": "0.11.0",
112
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.22.10.tgz",
113
- "@tryghost/package-json": "file:components/tryghost-package-json-5.22.10.tgz",
115
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.23.0.tgz",
116
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.23.0.tgz",
114
117
  "@tryghost/pretty-cli": "1.2.31",
115
118
  "@tryghost/promise": "0.2.1",
116
119
  "@tryghost/request": "0.1.31",
117
- "@tryghost/security": "file:components/tryghost-security-5.22.10.tgz",
118
- "@tryghost/session-service": "file:components/tryghost-session-service-5.22.10.tgz",
119
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.22.10.tgz",
120
+ "@tryghost/security": "file:components/tryghost-security-5.23.0.tgz",
121
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.23.0.tgz",
122
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.23.0.tgz",
120
123
  "@tryghost/social-urls": "0.1.33",
121
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.22.10.tgz",
122
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.22.10.tgz",
124
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.23.0.tgz",
125
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.23.0.tgz",
123
126
  "@tryghost/string": "0.2.1",
124
- "@tryghost/tiers": "file:components/tryghost-tiers-5.22.10.tgz",
127
+ "@tryghost/tiers": "file:components/tryghost-tiers-5.23.0.tgz",
125
128
  "@tryghost/tpl": "0.1.19",
126
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.22.10.tgz",
129
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.23.0.tgz",
127
130
  "@tryghost/url-utils": "4.2.0",
128
131
  "@tryghost/validator": "0.1.29",
129
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.22.10.tgz",
132
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.23.0.tgz",
130
133
  "@tryghost/version": "0.1.16",
131
134
  "@tryghost/zip": "1.1.29",
132
135
  "amperize": "0.6.1",
@@ -207,7 +210,7 @@
207
210
  "mock-knex": "TryGhost/mock-knex#8ecb8c227bf463c991c3d820d33f59efc3ab9682",
208
211
  "nock": "13.2.9",
209
212
  "papaparse": "5.3.2",
210
- "postcss": "8.4.18",
213
+ "postcss": "8.4.19",
211
214
  "postcss-cli": "10.0.0",
212
215
  "rewire": "6.0.0",
213
216
  "should": "13.2.3",
@@ -219,57 +222,56 @@
219
222
  "@tryghost/logging": "2.3.2",
220
223
  "moment": "2.24.0",
221
224
  "moment-timezone": "0.5.23",
222
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.22.10.tgz",
223
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.22.10.tgz",
224
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.22.10.tgz",
225
- "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.22.10.tgz",
226
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.22.10.tgz",
227
- "@tryghost/constants": "file:components/tryghost-constants-5.22.10.tgz",
228
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.22.10.tgz",
229
- "@tryghost/data-generator": "file:components/tryghost-data-generator-5.22.10.tgz",
230
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.22.10.tgz",
231
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.22.10.tgz",
232
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.22.10.tgz",
233
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.22.10.tgz",
234
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.22.10.tgz",
235
- "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.22.10.tgz",
236
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.22.10.tgz",
237
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.22.10.tgz",
238
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.22.10.tgz",
239
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.22.10.tgz",
240
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.22.10.tgz",
241
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.22.10.tgz",
242
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.22.10.tgz",
243
- "@tryghost/member-analytics-service": "file:components/tryghost-member-analytics-service-5.22.10.tgz",
244
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.22.10.tgz",
245
- "@tryghost/member-events": "file:components/tryghost-member-events-5.22.10.tgz",
246
- "@tryghost/members-analytics-ingress": "file:components/tryghost-members-analytics-ingress-5.22.10.tgz",
247
- "@tryghost/members-api": "file:components/tryghost-members-api-5.22.10.tgz",
248
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.22.10.tgz",
249
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.22.10.tgz",
250
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.22.10.tgz",
251
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.22.10.tgz",
252
- "@tryghost/minifier": "file:components/tryghost-minifier-5.22.10.tgz",
253
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.22.10.tgz",
254
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.22.10.tgz",
255
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.22.10.tgz",
256
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.22.10.tgz",
257
- "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.22.10.tgz",
258
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.22.10.tgz",
259
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.22.10.tgz",
260
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.22.10.tgz",
261
- "@tryghost/package-json": "file:components/tryghost-package-json-5.22.10.tgz",
262
- "@tryghost/members-payments": "file:components/tryghost-members-payments-5.22.10.tgz",
263
- "@tryghost/referrers": "file:components/tryghost-referrers-5.22.10.tgz",
264
- "@tryghost/security": "file:components/tryghost-security-5.22.10.tgz",
265
- "@tryghost/session-service": "file:components/tryghost-session-service-5.22.10.tgz",
266
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.22.10.tgz",
267
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.22.10.tgz",
268
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.22.10.tgz",
269
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.22.10.tgz",
270
- "@tryghost/tiers": "file:components/tryghost-tiers-5.22.10.tgz",
271
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.22.10.tgz",
272
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.22.10.tgz",
273
- "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.22.10.tgz"
225
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.23.0.tgz",
226
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.23.0.tgz",
227
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.23.0.tgz",
228
+ "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.23.0.tgz",
229
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.23.0.tgz",
230
+ "@tryghost/constants": "file:components/tryghost-constants-5.23.0.tgz",
231
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.23.0.tgz",
232
+ "@tryghost/data-generator": "file:components/tryghost-data-generator-5.23.0.tgz",
233
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.23.0.tgz",
234
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.23.0.tgz",
235
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.23.0.tgz",
236
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.23.0.tgz",
237
+ "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.23.0.tgz",
238
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.23.0.tgz",
239
+ "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.23.0.tgz",
240
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.23.0.tgz",
241
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.23.0.tgz",
242
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.23.0.tgz",
243
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.23.0.tgz",
244
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.23.0.tgz",
245
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.23.0.tgz",
246
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.23.0.tgz",
247
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.23.0.tgz",
248
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.23.0.tgz",
249
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.23.0.tgz",
250
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.23.0.tgz",
251
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.23.0.tgz",
252
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.23.0.tgz",
253
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.23.0.tgz",
254
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.23.0.tgz",
255
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.23.0.tgz",
256
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.23.0.tgz",
257
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.23.0.tgz",
258
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.23.0.tgz",
259
+ "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.23.0.tgz",
260
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.23.0.tgz",
261
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.23.0.tgz",
262
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.23.0.tgz",
263
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.23.0.tgz",
264
+ "@tryghost/members-payments": "file:components/tryghost-members-payments-5.23.0.tgz",
265
+ "@tryghost/referrers": "file:components/tryghost-referrers-5.23.0.tgz",
266
+ "@tryghost/security": "file:components/tryghost-security-5.23.0.tgz",
267
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.23.0.tgz",
268
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.23.0.tgz",
269
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.23.0.tgz",
270
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.23.0.tgz",
271
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.23.0.tgz",
272
+ "@tryghost/tiers": "file:components/tryghost-tiers-5.23.0.tgz",
273
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.23.0.tgz",
274
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.23.0.tgz",
275
+ "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.23.0.tgz"
274
276
  }
275
277
  }
@@ -0,0 +1,15 @@
1
+ const ghostConfig = require('./core/shared/config');
2
+
3
+ /** @type {import('@playwright/test').PlaywrightTestConfig} */
4
+ const config = {
5
+ timeout: 10 * 1000,
6
+ webServer: {
7
+ command: 'yarn test:browser:start',
8
+ url: ghostConfig.get('url')
9
+ },
10
+ use: {
11
+ baseURL: ghostConfig.get('url')
12
+ }
13
+ };
14
+
15
+ module.exports = config;