ghost 5.25.1 → 5.25.3

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 (102) hide show
  1. package/components/{tryghost-adapter-manager-5.25.1.tgz → tryghost-adapter-manager-5.25.3.tgz} +0 -0
  2. package/components/{tryghost-api-framework-5.25.1.tgz → tryghost-api-framework-5.25.3.tgz} +0 -0
  3. package/components/{tryghost-api-version-compatibility-service-5.25.1.tgz → tryghost-api-version-compatibility-service-5.25.3.tgz} +0 -0
  4. package/components/{tryghost-audience-feedback-5.25.1.tgz → tryghost-audience-feedback-5.25.3.tgz} +0 -0
  5. package/components/{tryghost-bootstrap-socket-5.25.1.tgz → tryghost-bootstrap-socket-5.25.3.tgz} +0 -0
  6. package/components/tryghost-constants-5.25.3.tgz +0 -0
  7. package/components/tryghost-custom-theme-settings-service-5.25.3.tgz +0 -0
  8. package/components/{tryghost-data-generator-5.25.1.tgz → tryghost-data-generator-5.25.3.tgz} +0 -0
  9. package/components/tryghost-domain-events-5.25.3.tgz +0 -0
  10. package/components/tryghost-email-analytics-provider-mailgun-5.25.3.tgz +0 -0
  11. package/components/{tryghost-email-analytics-service-5.25.1.tgz → tryghost-email-analytics-service-5.25.3.tgz} +0 -0
  12. package/components/tryghost-email-content-generator-5.25.3.tgz +0 -0
  13. package/components/tryghost-email-events-5.25.3.tgz +0 -0
  14. package/components/tryghost-email-service-5.25.3.tgz +0 -0
  15. package/components/tryghost-email-suppression-list-5.25.3.tgz +0 -0
  16. package/components/{tryghost-express-dynamic-redirects-5.25.1.tgz → tryghost-express-dynamic-redirects-5.25.3.tgz} +0 -0
  17. package/components/{tryghost-extract-api-key-5.25.1.tgz → tryghost-extract-api-key-5.25.3.tgz} +0 -0
  18. package/components/tryghost-html-to-plaintext-5.25.3.tgz +0 -0
  19. package/components/{tryghost-job-manager-5.25.1.tgz → tryghost-job-manager-5.25.3.tgz} +0 -0
  20. package/components/{tryghost-link-redirects-5.25.1.tgz → tryghost-link-redirects-5.25.3.tgz} +0 -0
  21. package/components/tryghost-link-replacer-5.25.3.tgz +0 -0
  22. package/components/{tryghost-link-tracking-5.25.1.tgz → tryghost-link-tracking-5.25.3.tgz} +0 -0
  23. package/components/{tryghost-magic-link-5.25.1.tgz → tryghost-magic-link-5.25.3.tgz} +0 -0
  24. package/components/tryghost-mailgun-client-5.25.3.tgz +0 -0
  25. package/components/{tryghost-member-attribution-5.25.1.tgz → tryghost-member-attribution-5.25.3.tgz} +0 -0
  26. package/components/{tryghost-member-events-5.25.1.tgz → tryghost-member-events-5.25.3.tgz} +0 -0
  27. package/components/tryghost-members-api-5.25.3.tgz +0 -0
  28. package/components/{tryghost-members-csv-5.25.1.tgz → tryghost-members-csv-5.25.3.tgz} +0 -0
  29. package/components/tryghost-members-events-service-5.25.3.tgz +0 -0
  30. package/components/{tryghost-members-importer-5.25.1.tgz → tryghost-members-importer-5.25.3.tgz} +0 -0
  31. package/components/{tryghost-members-offers-5.25.1.tgz → tryghost-members-offers-5.25.3.tgz} +0 -0
  32. package/components/tryghost-members-payments-5.25.3.tgz +0 -0
  33. package/components/{tryghost-members-ssr-5.25.1.tgz → tryghost-members-ssr-5.25.3.tgz} +0 -0
  34. package/components/{tryghost-members-stripe-service-5.25.1.tgz → tryghost-members-stripe-service-5.25.3.tgz} +0 -0
  35. package/components/{tryghost-minifier-5.25.1.tgz → tryghost-minifier-5.25.3.tgz} +0 -0
  36. package/components/tryghost-mw-api-version-mismatch-5.25.3.tgz +0 -0
  37. package/components/{tryghost-mw-cache-control-5.25.1.tgz → tryghost-mw-cache-control-5.25.3.tgz} +0 -0
  38. package/components/{tryghost-mw-error-handler-5.25.1.tgz → tryghost-mw-error-handler-5.25.3.tgz} +0 -0
  39. package/components/{tryghost-mw-session-from-token-5.25.1.tgz → tryghost-mw-session-from-token-5.25.3.tgz} +0 -0
  40. package/components/tryghost-mw-update-user-last-seen-5.25.3.tgz +0 -0
  41. package/components/tryghost-mw-vhost-5.25.3.tgz +0 -0
  42. package/components/tryghost-oembed-service-5.25.3.tgz +0 -0
  43. package/components/{tryghost-package-json-5.25.1.tgz → tryghost-package-json-5.25.3.tgz} +0 -0
  44. package/components/tryghost-referrers-5.25.3.tgz +0 -0
  45. package/components/tryghost-security-5.25.3.tgz +0 -0
  46. package/components/{tryghost-session-service-5.25.1.tgz → tryghost-session-service-5.25.3.tgz} +0 -0
  47. package/components/{tryghost-settings-path-manager-5.25.1.tgz → tryghost-settings-path-manager-5.25.3.tgz} +0 -0
  48. package/components/{tryghost-staff-service-5.25.1.tgz → tryghost-staff-service-5.25.3.tgz} +0 -0
  49. package/components/{tryghost-stats-service-5.25.1.tgz → tryghost-stats-service-5.25.3.tgz} +0 -0
  50. package/components/tryghost-tiers-5.25.3.tgz +0 -0
  51. package/components/{tryghost-update-check-service-5.25.1.tgz → tryghost-update-check-service-5.25.3.tgz} +0 -0
  52. package/components/{tryghost-verification-trigger-5.25.1.tgz → tryghost-verification-trigger-5.25.3.tgz} +0 -0
  53. package/components/{tryghost-version-notifications-data-service-5.25.1.tgz → tryghost-version-notifications-data-service-5.25.3.tgz} +0 -0
  54. package/core/built/admin/assets/{chunk.143.0dc2fb34377630cd95b4.js → chunk.143.37f5727f90df66ade091.js} +19 -19
  55. package/core/built/admin/assets/{chunk.178.fee48b8b52dc3ad83ba1.js → chunk.178.fbba40422427964e79c9.js} +4 -4
  56. package/core/built/admin/assets/{chunk.507.37279ad3a2f6aeb82302.js → chunk.507.f7ed7e0b5ac069083e0c.js} +105 -104
  57. package/core/built/admin/assets/{chunk.613.a29fe5699dd5f7fb05f1.js → chunk.613.551c7c3e872b9a811863.js} +229 -227
  58. package/core/built/admin/assets/{chunk.613.a29fe5699dd5f7fb05f1.js.LICENSE.txt → chunk.613.551c7c3e872b9a811863.js.LICENSE.txt} +0 -0
  59. package/core/built/admin/assets/codemirror/{codemirror-1b460af155bb0ecaab9591678ac8c942.js → codemirror-a81c0653d8e57286b75c5a1792f80779.js} +1 -1
  60. package/core/built/admin/assets/{ghost-a66ff073d219101414fa7b344095c1ca.js → ghost-15f77300dbb6762873d6692e0485a37a.js} +316 -314
  61. package/core/built/admin/assets/{ghost-16dd31e7747e2dce6313f4362842b7b7.css → ghost-86cf21b24691d4fe9a73bcf84e5b36fe.css} +1 -1
  62. package/core/built/admin/assets/{ghost-dark-1117e1c672c39d594cdd1dfdf3d1c1ac.css → ghost-dark-2e0bf27a167574e0b2ca9dce1c9ec188.css} +1 -1
  63. package/core/built/admin/assets/simplemde/{simplemde-0cd04dbb388ed0cf571a6808464ea57e.js → simplemde-2885e4a40ed66fcae974595584efe50b.js} +1 -1
  64. package/core/built/admin/assets/{vendor-a767da2d0322ba6e801e0d719ccf5a26.js → vendor-0d29a566ca9747f2cfba9d7c98e39f53.js} +530 -525
  65. package/core/built/admin/index.html +5 -5
  66. package/core/cli/record-test.js +9 -26
  67. package/core/server/services/email-service/wrapper.js +2 -0
  68. package/core/server/services/email-suppression-list/MailgunEmailSuppressionList.js +10 -5
  69. package/core/server/services/mega/mega.js +0 -10
  70. package/core/server/services/mega/post-email-serializer.js +4 -3
  71. package/core/server/services/members/middleware.js +3 -2
  72. package/core/server/services/stripe/service.js +2 -1
  73. package/core/shared/config/defaults.json +1 -1
  74. package/core/shared/config/env/config.development.json +3 -0
  75. package/core/shared/config/env/config.testing-browser.json +58 -0
  76. package/core/shared/config/env/config.testing.json +0 -5
  77. package/core/shared/config/loader.js +1 -1
  78. package/core/shared/config/overrides.json +4 -3
  79. package/core/shared/sentry.js +1 -0
  80. package/package.json +111 -108
  81. package/yarn.lock +49 -49
  82. package/components/tryghost-constants-5.25.1.tgz +0 -0
  83. package/components/tryghost-custom-theme-settings-service-5.25.1.tgz +0 -0
  84. package/components/tryghost-domain-events-5.25.1.tgz +0 -0
  85. package/components/tryghost-email-analytics-provider-mailgun-5.25.1.tgz +0 -0
  86. package/components/tryghost-email-content-generator-5.25.1.tgz +0 -0
  87. package/components/tryghost-email-events-5.25.1.tgz +0 -0
  88. package/components/tryghost-email-service-5.25.1.tgz +0 -0
  89. package/components/tryghost-email-suppression-list-5.25.1.tgz +0 -0
  90. package/components/tryghost-html-to-plaintext-5.25.1.tgz +0 -0
  91. package/components/tryghost-link-replacer-5.25.1.tgz +0 -0
  92. package/components/tryghost-mailgun-client-5.25.1.tgz +0 -0
  93. package/components/tryghost-members-api-5.25.1.tgz +0 -0
  94. package/components/tryghost-members-events-service-5.25.1.tgz +0 -0
  95. package/components/tryghost-members-payments-5.25.1.tgz +0 -0
  96. package/components/tryghost-mw-api-version-mismatch-5.25.1.tgz +0 -0
  97. package/components/tryghost-mw-update-user-last-seen-5.25.1.tgz +0 -0
  98. package/components/tryghost-mw-vhost-5.25.1.tgz +0 -0
  99. package/components/tryghost-oembed-service-5.25.1.tgz +0 -0
  100. package/components/tryghost-referrers-5.25.1.tgz +0 -0
  101. package/components/tryghost-security-5.25.1.tgz +0 -0
  102. package/components/tryghost-tiers-5.25.1.tgz +0 -0
@@ -37,7 +37,7 @@
37
37
  </style>
38
38
 
39
39
  <link integrity="" rel="stylesheet" href="assets/vendor-3e6947aa681f0fb82b193090e520dc73.css">
40
- <link integrity="" rel="stylesheet" href="assets/ghost-16dd31e7747e2dce6313f4362842b7b7.css" title="light">
40
+ <link integrity="" rel="stylesheet" href="assets/ghost-86cf21b24691d4fe9a73bcf84e5b36fe.css" title="light">
41
41
 
42
42
 
43
43
  </head>
@@ -56,9 +56,9 @@
56
56
 
57
57
  <div id="ember-basic-dropdown-wormhole"></div>
58
58
 
59
- <script src="assets/vendor-a767da2d0322ba6e801e0d719ccf5a26.js"></script>
60
- <script src="assets/chunk.613.a29fe5699dd5f7fb05f1.js"></script>
61
- <script src="assets/chunk.143.0dc2fb34377630cd95b4.js"></script>
62
- <script src="assets/ghost-a66ff073d219101414fa7b344095c1ca.js"></script>
59
+ <script src="assets/vendor-0d29a566ca9747f2cfba9d7c98e39f53.js"></script>
60
+ <script src="assets/chunk.613.551c7c3e872b9a811863.js"></script>
61
+ <script src="assets/chunk.143.37f5727f90df66ade091.js"></script>
62
+ <script src="assets/ghost-15f77300dbb6762873d6692e0485a37a.js"></script>
63
63
  </body>
64
64
  </html>
@@ -1,46 +1,29 @@
1
1
  const {chromium} = require('@playwright/test');
2
2
  const Command = require('./command');
3
- const testUtils = require('../../test/utils');
3
+ const playwrightConfig = require('../../playwright.config');
4
+ const {globalSetup} = require('../../test/e2e-browser/utils');
4
5
 
5
6
  module.exports = class RecordTest extends Command {
6
7
  setup() {
7
8
  this.help('Use PlayWright to record a browser-based test');
8
- this.argument('--admin', {type: 'boolean', defaultValue: false, desc: 'Start browser-based test in Ghost admin'});
9
- this.argument('--no-setup', {type: 'boolean', defaultValue: false, desc: 'Disable the default setup, for testing Ghost admin setup'});
10
- this.argument('--fixtures', {type: 'array', defaultValue: [], delimiter: ',', desc: 'A list of comma-separated fixtures to include'});
11
9
  }
12
10
 
13
11
  permittedEnvironments() {
14
- return ['development', 'testing'];
12
+ return ['testing-browser'];
15
13
  }
16
14
 
17
- async handle(argv) {
18
- const app = await testUtils.startGhost();
19
-
20
- if (argv.fixtures.length > 0) {
21
- await testUtils.initFixtures(...argv.fixtures);
22
- }
15
+ async handle() {
16
+ await globalSetup({
17
+ projects: [playwrightConfig]
18
+ });
23
19
 
24
20
  const browser = await chromium.launch({headless: false});
25
21
 
26
- const baseURL = argv.admin ? `${app.url}ghost/` : app.url;
27
- const context = await browser.newContext({
28
- baseURL
29
- });
22
+ const context = await browser.newContext(playwrightConfig.use);
30
23
 
31
24
  // Pause the page, and start recording manually.
32
25
  const page = await context.newPage();
33
- await page.goto('');
34
-
35
- if (argv.admin && !argv['no-setup']) {
36
- await page.getByPlaceholder('The Daily Awesome').click();
37
- await page.getByPlaceholder('The Daily Awesome').fill('The Local Test');
38
- await page.getByPlaceholder('Jamie Larson').fill('Testy McTesterson');
39
- await page.getByPlaceholder('jamie@example.com').fill('testy@example.com');
40
- await page.getByPlaceholder('At least 10 characters').fill('Mc.T3ster$0n');
41
- await page.getByPlaceholder('At least 10 characters').press('Enter');
42
- await page.locator('.gh-done-pink').click();
43
- }
26
+ await page.goto('/ghost');
44
27
 
45
28
  await page.pause();
46
29
  }
@@ -34,6 +34,7 @@ class EmailServiceWrapper {
34
34
  const linkReplacer = require('@tryghost/link-replacer');
35
35
  const linkTracking = require('../link-tracking');
36
36
  const audienceFeedback = require('../audience-feedback');
37
+ const storageUtils = require('../../adapters/storage/utils');
37
38
 
38
39
  // capture errors from mailgun client and log them in sentry
39
40
  const errorHandler = (error) => {
@@ -60,6 +61,7 @@ class EmailServiceWrapper {
60
61
  },
61
62
  imageSize: null,
62
63
  urlUtils,
64
+ storageUtils,
63
65
  getPostUrl: this.getPostUrl,
64
66
  linkReplacer,
65
67
  linkTracking,
@@ -1,4 +1,4 @@
1
- const {AbstractEmailSuppressionList, EmailSuppressionData} = require('@tryghost/email-suppression-list');
1
+ const {AbstractEmailSuppressionList, EmailSuppressionData, EmailSuppressedEvent} = require('@tryghost/email-suppression-list');
2
2
  const {SpamComplaintEvent, EmailBouncedEvent} = require('@tryghost/email-events');
3
3
  const DomainEvents = require('@tryghost/domain-events');
4
4
  const logging = require('@tryghost/logging');
@@ -95,22 +95,27 @@ class MailgunEmailSuppressionList extends AbstractEmailSuppressionList {
95
95
  }
96
96
 
97
97
  async init() {
98
- const handleEvent = async (event) => {
98
+ const handleEvent = reason => async (event) => {
99
99
  try {
100
100
  await this.Suppression.add({
101
101
  email_address: event.email,
102
102
  email_id: event.emailId,
103
- reason: 'bounce',
103
+ reason: reason,
104
104
  created_at: event.timestamp
105
105
  });
106
+ DomainEvents.dispatch(EmailSuppressedEvent.create({
107
+ emailAddress: event.email,
108
+ emailId: event.emailId,
109
+ reason: reason
110
+ }, event.timestamp));
106
111
  } catch (err) {
107
112
  if (err.code !== 'ER_DUP_ENTRY') {
108
113
  logging.error(err);
109
114
  }
110
115
  }
111
116
  };
112
- DomainEvents.subscribe(EmailBouncedEvent, handleEvent);
113
- DomainEvents.subscribe(SpamComplaintEvent, handleEvent);
117
+ DomainEvents.subscribe(EmailBouncedEvent, handleEvent('bounce'));
118
+ DomainEvents.subscribe(SpamComplaintEvent, handleEvent('spam'));
114
119
  }
115
120
  }
116
121
 
@@ -15,7 +15,6 @@ const db = require('../../data/db');
15
15
  const models = require('../../models');
16
16
  const postEmailSerializer = require('./post-email-serializer');
17
17
  const {getSegmentsFromHtml} = require('./segment-parser');
18
- const emailSuppressionList = require('../email-suppression-list');
19
18
  const labs = require('../../../shared/labs');
20
19
 
21
20
  // Used to listen to email.added and email.edited model events originally, I think to offload this - ideally would just use jobs now if possible
@@ -564,15 +563,6 @@ async function createEmailBatches({emailModel, memberRows, memberSegment, option
564
563
  debug('createEmailBatches: storing recipient list');
565
564
  const startOfRecipientStorage = Date.now();
566
565
  let rowsToBatch = memberRows;
567
- if (labs.isSet('suppressionList')) {
568
- const emails = memberRows.map(row => row.email);
569
- const emailSuppressionData = await emailSuppressionList.getBulkSuppressionData(emails);
570
- const emailSuppressedLookup = _.zipObject(emails, emailSuppressionData);
571
- const filteredRows = memberRows.filter((row) => {
572
- return emailSuppressedLookup[row.email].suppressed === false;
573
- });
574
- rowsToBatch = filteredRows;
575
- }
576
566
  const batches = _.chunk(rowsToBatch, bulkEmailService.BATCH_SIZE);
577
567
  const batchIds = await Promise.mapSeries(batches, storeRecipientBatch);
578
568
  debug(`createEmailBatches: stored recipient list (${Date.now() - startOfRecipientStorage}ms)`);
@@ -10,7 +10,7 @@ const mobiledocLib = require('../../lib/mobiledoc');
10
10
  const lexicalLib = require('../../lib/lexical');
11
11
  const htmlToPlaintext = require('@tryghost/html-to-plaintext');
12
12
  const membersService = require('../members');
13
- const {isUnsplashImage, isLocalContentImage} = require('@tryghost/kg-default-cards/lib/utils');
13
+ const {isUnsplashImage} = require('@tryghost/kg-default-cards/lib/utils');
14
14
  const {textColorForBackgroundColor, darkenToContrastThreshold} = require('@tryghost/color-utils');
15
15
  const logging = require('@tryghost/logging');
16
16
  const urlService = require('../../services/url');
@@ -19,6 +19,7 @@ const linkTracking = require('../link-tracking');
19
19
  const memberAttribution = require('../member-attribution');
20
20
  const feedbackButtons = require('./feedback-buttons');
21
21
  const labs = require('../../../shared/labs');
22
+ const storageUtils = require('../../adapters/storage/utils');
22
23
 
23
24
  const ALLOWED_REPLACEMENTS = ['first_name', 'uuid'];
24
25
 
@@ -261,7 +262,7 @@ const PostEmailSerializer = {
261
262
  templateSettings.headerImageWidth = 600;
262
263
  }
263
264
 
264
- if (isLocalContentImage(templateSettings.headerImage, urlUtils.getSiteUrl())) {
265
+ if (storageUtils.isLocalImage(templateSettings.headerImage)) {
265
266
  // we can safely request a 1200px image - Ghost will serve the original if it's smaller
266
267
  templateSettings.headerImage = templateSettings.headerImage.replace(/\/content\/images\//, '/content/images/size/w1200/');
267
268
  }
@@ -348,7 +349,7 @@ const PostEmailSerializer = {
348
349
  post.feature_image_width = 600;
349
350
  }
350
351
 
351
- if (isLocalContentImage(post.feature_image, urlUtils.getSiteUrl())) {
352
+ if (storageUtils.isLocalImage(post.feature_image)) {
352
353
  // we can safely request a 1200px image - Ghost will serve the original if it's smaller
353
354
  post.feature_image = post.feature_image.replace(/\/content\/images\//, '/content/images/size/w1200/');
354
355
  }
@@ -180,9 +180,10 @@ const updateMemberData = async function (req, res) {
180
180
  id: member.id,
181
181
  withRelated: ['stripeSubscriptions', 'stripeSubscriptions.customer', 'stripeSubscriptions.stripePrice', 'newsletters']
182
182
  };
183
- const updatedMember = await membersService.api.members.update(data, options);
183
+ await membersService.api.members.update(data, options);
184
+ const updatedMember = await membersService.ssr.getMemberDataFromSession(req, res);
184
185
 
185
- res.json(formattedMemberResponse(updatedMember.toJSON()));
186
+ res.json(formattedMemberResponse(updatedMember));
186
187
  } else {
187
188
  res.json(null);
188
189
  }
@@ -13,7 +13,8 @@ const settingsHelpers = require('../settings-helpers');
13
13
  async function configureApi() {
14
14
  const cfg = getConfig({settingsHelpers, config, urlUtils});
15
15
  if (cfg) {
16
- cfg.testEnv = process.env.NODE_ENV.startsWith('test');
16
+ // @NOTE: to not start test mode when running playwright suite
17
+ cfg.testEnv = process.env.NODE_ENV.startsWith('test') && process.env.NODE_ENV !== 'testing-browser';
17
18
  await module.exports.configure(cfg);
18
19
  return true;
19
20
  }
@@ -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.20"
164
+ "version": "2.21"
165
165
  },
166
166
  "sodoSearch": {
167
167
  "url": "https://cdn.jsdelivr.net/ghost/sodo-search@~{version}/umd/sodo-search.min.js",
@@ -22,5 +22,8 @@
22
22
  "admin": {
23
23
  "maxAge": 0
24
24
  }
25
+ },
26
+ "editor": {
27
+ "url": "http://127.0.0.1:4173/koenig-lexical.umd.js"
25
28
  }
26
29
  }
@@ -0,0 +1,58 @@
1
+ {
2
+ "url": "http://127.0.0.1:2369",
3
+ "database": {
4
+ "client": "sqlite3",
5
+ "connection": {
6
+ "filename": "/tmp/ghost-test.db"
7
+ },
8
+ "useNullAsDefault": true,
9
+ "debug": false
10
+ },
11
+ "server": {
12
+ "port": 2369
13
+ },
14
+ "logging": {
15
+ "level": "fatal"
16
+ },
17
+ "spam": {
18
+ "user_login": {
19
+ "minWait": 600000,
20
+ "maxWait": 604800000,
21
+ "freeRetries": 3
22
+ },
23
+ "user_reset": {
24
+ "minWait": 3600000,
25
+ "maxWait": 3600000,
26
+ "lifetime": 3600,
27
+ "freeRetries": 4
28
+ },
29
+ "global_reset": {
30
+ "minWait": 3600000,
31
+ "maxWait": 3600000,
32
+ "lifetime": 3600,
33
+ "freeRetries":4
34
+ },
35
+ "global_block": {
36
+ "minWait": 3600000,
37
+ "maxWait": 3600000,
38
+ "lifetime": 3600,
39
+ "freeRetries":4
40
+ },
41
+ "private_block": {
42
+ "minWait": 3600000,
43
+ "maxWait": 3600000,
44
+ "lifetime": 3600,
45
+ "freeRetries":99
46
+ }
47
+ },
48
+ "privacy": {
49
+ "useTinfoil": true,
50
+ "useStructuredData": true
51
+ },
52
+ "useMinFiles": false,
53
+ "paths": {
54
+ "fixtures": "test/utils/fixtures/fixtures",
55
+ "defaultSettings": "test/utils/fixtures/default-settings-browser.json",
56
+ "urlCache": "test/utils/fixtures/urls"
57
+ }
58
+ }
@@ -54,10 +54,5 @@
54
54
  "fixtures": "test/utils/fixtures/fixtures",
55
55
  "defaultSettings": "test/utils/fixtures/default-settings.json",
56
56
  "urlCache": "test/utils/fixtures/urls"
57
- },
58
- "sodoSearch": {
59
- "url": "https://cdn.jsdelivr.net/npm/@tryghost/sodo-search@~{version}/umd/sodo-search.min.js",
60
- "styles": "https://cdn.jsdelivr.net/npm/@tryghost/sodo-search@~{version}/umd/main.css",
61
- "version": "1.0"
62
57
  }
63
58
  }
@@ -30,7 +30,7 @@ function loadNconf(options) {
30
30
 
31
31
  // Now load various config json files
32
32
  nconf.file('custom-env', path.join(customConfigPath, 'config.' + env + '.json'));
33
- if (env !== 'testing') {
33
+ if (!env.startsWith('testing')) {
34
34
  nconf.file('local-env', path.join(customConfigPath, 'config.local.json'));
35
35
  }
36
36
  nconf.file('default-env', path.join(baseConfigPath, 'env', 'config.' + env + '.json'));
@@ -70,8 +70,8 @@
70
70
  }
71
71
  },
72
72
  "times": {
73
- "cannotScheduleAPostBeforeInMinutes": 2,
74
- "publishAPostBySchedulerToleranceInMinutes": 2,
73
+ "cannotScheduleAPostBeforeInMinutes": -2,
74
+ "publishAPostBySchedulerToleranceInMinutes": 5,
75
75
  "getImageSizeTimeoutInMS": 5000
76
76
  },
77
77
  "maintenance": {
@@ -86,7 +86,8 @@
86
86
  "w2400": {"width": 2400}
87
87
  },
88
88
  "internalImageSizes": {
89
- "icon": {"width": 256, "height": 256}
89
+ "icon": {"width": 256, "height": 256},
90
+ "email-header-image": {"width": 1200}
90
91
  }
91
92
  }
92
93
  }
@@ -10,6 +10,7 @@ if (sentryConfig && !sentryConfig.disabled) {
10
10
  dsn: sentryConfig.dsn,
11
11
  release: 'ghost@' + version,
12
12
  environment: environment,
13
+ maxValueLength: 1000,
13
14
  beforeSend: function (event, hint) {
14
15
  const exception = hint.originalException;
15
16