ghost 5.40.1 → 5.41.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 (135) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/components/tryghost-adapter-cache-memory-ttl-5.41.0.tgz +0 -0
  4. package/components/{tryghost-adapter-cache-redis-5.40.1.tgz → tryghost-adapter-cache-redis-5.41.0.tgz} +0 -0
  5. package/components/{tryghost-adapter-manager-5.40.1.tgz → tryghost-adapter-manager-5.41.0.tgz} +0 -0
  6. package/components/tryghost-api-framework-5.41.0.tgz +0 -0
  7. package/components/{tryghost-api-version-compatibility-service-5.40.1.tgz → tryghost-api-version-compatibility-service-5.41.0.tgz} +0 -0
  8. package/components/{tryghost-audience-feedback-5.40.1.tgz → tryghost-audience-feedback-5.41.0.tgz} +0 -0
  9. package/components/tryghost-bootstrap-socket-5.41.0.tgz +0 -0
  10. package/components/tryghost-constants-5.41.0.tgz +0 -0
  11. package/components/tryghost-custom-theme-settings-service-5.41.0.tgz +0 -0
  12. package/components/{tryghost-data-generator-5.40.1.tgz → tryghost-data-generator-5.41.0.tgz} +0 -0
  13. package/components/tryghost-domain-events-5.41.0.tgz +0 -0
  14. package/components/tryghost-dynamic-routing-events-5.41.0.tgz +0 -0
  15. package/components/tryghost-email-analytics-provider-mailgun-5.41.0.tgz +0 -0
  16. package/components/{tryghost-email-analytics-service-5.40.1.tgz → tryghost-email-analytics-service-5.41.0.tgz} +0 -0
  17. package/components/tryghost-email-content-generator-5.41.0.tgz +0 -0
  18. package/components/{tryghost-email-events-5.40.1.tgz → tryghost-email-events-5.41.0.tgz} +0 -0
  19. package/components/tryghost-email-service-5.41.0.tgz +0 -0
  20. package/components/tryghost-email-suppression-list-5.41.0.tgz +0 -0
  21. package/components/{tryghost-event-aware-cache-wrapper-5.40.1.tgz → tryghost-event-aware-cache-wrapper-5.41.0.tgz} +0 -0
  22. package/components/{tryghost-express-dynamic-redirects-5.40.1.tgz → tryghost-express-dynamic-redirects-5.41.0.tgz} +0 -0
  23. package/components/{tryghost-external-media-inliner-5.40.1.tgz → tryghost-external-media-inliner-5.41.0.tgz} +0 -0
  24. package/components/{tryghost-extract-api-key-5.40.1.tgz → tryghost-extract-api-key-5.41.0.tgz} +0 -0
  25. package/components/tryghost-html-to-plaintext-5.41.0.tgz +0 -0
  26. package/components/tryghost-i18n-5.41.0.tgz +0 -0
  27. package/components/{tryghost-importer-handler-content-files-5.40.1.tgz → tryghost-importer-handler-content-files-5.41.0.tgz} +0 -0
  28. package/components/{tryghost-importer-revue-5.40.1.tgz → tryghost-importer-revue-5.41.0.tgz} +0 -0
  29. package/components/tryghost-job-manager-5.41.0.tgz +0 -0
  30. package/components/tryghost-link-redirects-5.41.0.tgz +0 -0
  31. package/components/tryghost-link-replacer-5.41.0.tgz +0 -0
  32. package/components/{tryghost-link-tracking-5.40.1.tgz → tryghost-link-tracking-5.41.0.tgz} +0 -0
  33. package/components/tryghost-magic-link-5.41.0.tgz +0 -0
  34. package/components/tryghost-mailgun-client-5.41.0.tgz +0 -0
  35. package/components/tryghost-member-attribution-5.41.0.tgz +0 -0
  36. package/components/tryghost-member-events-5.41.0.tgz +0 -0
  37. package/components/{tryghost-members-api-5.40.1.tgz → tryghost-members-api-5.41.0.tgz} +0 -0
  38. package/components/{tryghost-members-csv-5.40.1.tgz → tryghost-members-csv-5.41.0.tgz} +0 -0
  39. package/components/{tryghost-members-events-service-5.40.1.tgz → tryghost-members-events-service-5.41.0.tgz} +0 -0
  40. package/components/tryghost-members-importer-5.41.0.tgz +0 -0
  41. package/components/{tryghost-members-offers-5.40.1.tgz → tryghost-members-offers-5.41.0.tgz} +0 -0
  42. package/components/tryghost-members-payments-5.41.0.tgz +0 -0
  43. package/components/{tryghost-members-ssr-5.40.1.tgz → tryghost-members-ssr-5.41.0.tgz} +0 -0
  44. package/components/{tryghost-members-stripe-service-5.40.1.tgz → tryghost-members-stripe-service-5.41.0.tgz} +0 -0
  45. package/components/{tryghost-mentions-email-report-5.40.1.tgz → tryghost-mentions-email-report-5.41.0.tgz} +0 -0
  46. package/components/tryghost-milestones-5.41.0.tgz +0 -0
  47. package/components/{tryghost-minifier-5.40.1.tgz → tryghost-minifier-5.41.0.tgz} +0 -0
  48. package/components/tryghost-mw-api-version-mismatch-5.41.0.tgz +0 -0
  49. package/components/tryghost-mw-cache-control-5.41.0.tgz +0 -0
  50. package/components/{tryghost-mw-error-handler-5.40.1.tgz → tryghost-mw-error-handler-5.41.0.tgz} +0 -0
  51. package/components/tryghost-mw-session-from-token-5.41.0.tgz +0 -0
  52. package/components/tryghost-mw-update-user-last-seen-5.41.0.tgz +0 -0
  53. package/components/tryghost-mw-version-match-5.41.0.tgz +0 -0
  54. package/components/tryghost-mw-vhost-5.41.0.tgz +0 -0
  55. package/components/tryghost-oembed-service-5.41.0.tgz +0 -0
  56. package/components/tryghost-package-json-5.41.0.tgz +0 -0
  57. package/components/tryghost-posts-service-5.41.0.tgz +0 -0
  58. package/components/tryghost-referrers-5.41.0.tgz +0 -0
  59. package/components/{tryghost-security-5.40.1.tgz → tryghost-security-5.41.0.tgz} +0 -0
  60. package/components/{tryghost-session-service-5.40.1.tgz → tryghost-session-service-5.41.0.tgz} +0 -0
  61. package/components/tryghost-settings-path-manager-5.41.0.tgz +0 -0
  62. package/components/tryghost-slack-notifications-5.41.0.tgz +0 -0
  63. package/components/tryghost-staff-service-5.41.0.tgz +0 -0
  64. package/components/{tryghost-stats-service-5.40.1.tgz → tryghost-stats-service-5.41.0.tgz} +0 -0
  65. package/components/{tryghost-tiers-5.40.1.tgz → tryghost-tiers-5.41.0.tgz} +0 -0
  66. package/components/tryghost-update-check-service-5.41.0.tgz +0 -0
  67. package/components/{tryghost-verification-trigger-5.40.1.tgz → tryghost-verification-trigger-5.41.0.tgz} +0 -0
  68. package/components/tryghost-version-notifications-data-service-5.41.0.tgz +0 -0
  69. package/components/{tryghost-webmentions-5.40.1.tgz → tryghost-webmentions-5.41.0.tgz} +0 -0
  70. package/content/themes/casper/default.hbs +1 -1
  71. package/content/themes/casper/package.json +2 -2
  72. package/core/built/admin/assets/{chunk.143.28e9fe97bf250c9d07db.js → chunk.143.78da682c0f256cf61289.js} +5 -5
  73. package/core/built/admin/assets/{chunk.178.9cfe2f1ed15ec6eb9443.js → chunk.178.52253aa28aef529e9a9a.js} +4 -4
  74. package/core/built/admin/assets/{chunk.462.b66cfed1f66c8d2678b2.js → chunk.324.2c415c5d0691230623df.js} +4279 -3646
  75. package/core/built/admin/assets/{ghost-467b96c17c6bc0d06fa88e85074fbecf.js → ghost-4b392979da29476ec2b63e8437f26a9a.js} +4481 -4411
  76. package/core/built/admin/assets/ghost-4c8239333143ae4b8d6046cca482b7ce.css +1 -0
  77. package/core/built/admin/assets/ghost-dark-3bba379f421799fc4db80036a6bcabf8.css +1 -0
  78. package/core/built/admin/index.html +5 -5
  79. package/core/frontend/helpers/ghost_head.js +2 -1
  80. package/core/server/data/migrations/versions/5.40/2023-03-21-19-02-add-self-serve-integration-api-key.js +1 -1
  81. package/core/server/data/migrations/versions/5.41/2023-03-27-15-00-add-newsletter-colors.js +22 -0
  82. package/core/server/data/migrations/versions/5.41/2023-03-27-17-51-fix-self-serve-integration-api-key-type.js +36 -0
  83. package/core/server/data/schema/schema.js +3 -0
  84. package/core/server/models/newsletter.js +3 -0
  85. package/core/server/services/i18n.js +31 -9
  86. package/core/server/services/mentions-email-report/service.js +7 -2
  87. package/core/server/services/posts/posts-service.js +2 -1
  88. package/core/shared/config/defaults.json +1 -1
  89. package/core/shared/config/env/config.testing-browser.json +2 -1
  90. package/core/shared/config/env/config.testing-mysql.json +1 -1
  91. package/core/shared/config/env/config.testing.json +1 -1
  92. package/core/shared/labs.js +2 -1
  93. package/package.json +135 -135
  94. package/yarn.lock +50 -147
  95. package/components/tryghost-adapter-cache-memory-ttl-5.40.1.tgz +0 -0
  96. package/components/tryghost-api-framework-5.40.1.tgz +0 -0
  97. package/components/tryghost-bootstrap-socket-5.40.1.tgz +0 -0
  98. package/components/tryghost-constants-5.40.1.tgz +0 -0
  99. package/components/tryghost-custom-theme-settings-service-5.40.1.tgz +0 -0
  100. package/components/tryghost-domain-events-5.40.1.tgz +0 -0
  101. package/components/tryghost-dynamic-routing-events-5.40.1.tgz +0 -0
  102. package/components/tryghost-email-analytics-provider-mailgun-5.40.1.tgz +0 -0
  103. package/components/tryghost-email-content-generator-5.40.1.tgz +0 -0
  104. package/components/tryghost-email-service-5.40.1.tgz +0 -0
  105. package/components/tryghost-email-suppression-list-5.40.1.tgz +0 -0
  106. package/components/tryghost-html-to-plaintext-5.40.1.tgz +0 -0
  107. package/components/tryghost-i18n-5.40.1.tgz +0 -0
  108. package/components/tryghost-job-manager-5.40.1.tgz +0 -0
  109. package/components/tryghost-link-redirects-5.40.1.tgz +0 -0
  110. package/components/tryghost-link-replacer-5.40.1.tgz +0 -0
  111. package/components/tryghost-magic-link-5.40.1.tgz +0 -0
  112. package/components/tryghost-mailgun-client-5.40.1.tgz +0 -0
  113. package/components/tryghost-member-attribution-5.40.1.tgz +0 -0
  114. package/components/tryghost-member-events-5.40.1.tgz +0 -0
  115. package/components/tryghost-members-importer-5.40.1.tgz +0 -0
  116. package/components/tryghost-members-payments-5.40.1.tgz +0 -0
  117. package/components/tryghost-milestones-5.40.1.tgz +0 -0
  118. package/components/tryghost-mw-api-version-mismatch-5.40.1.tgz +0 -0
  119. package/components/tryghost-mw-cache-control-5.40.1.tgz +0 -0
  120. package/components/tryghost-mw-session-from-token-5.40.1.tgz +0 -0
  121. package/components/tryghost-mw-update-user-last-seen-5.40.1.tgz +0 -0
  122. package/components/tryghost-mw-version-match-5.40.1.tgz +0 -0
  123. package/components/tryghost-mw-vhost-5.40.1.tgz +0 -0
  124. package/components/tryghost-oembed-service-5.40.1.tgz +0 -0
  125. package/components/tryghost-package-json-5.40.1.tgz +0 -0
  126. package/components/tryghost-posts-service-5.40.1.tgz +0 -0
  127. package/components/tryghost-referrers-5.40.1.tgz +0 -0
  128. package/components/tryghost-settings-path-manager-5.40.1.tgz +0 -0
  129. package/components/tryghost-slack-notifications-5.40.1.tgz +0 -0
  130. package/components/tryghost-staff-service-5.40.1.tgz +0 -0
  131. package/components/tryghost-update-check-service-5.40.1.tgz +0 -0
  132. package/components/tryghost-version-notifications-data-service-5.40.1.tgz +0 -0
  133. package/core/built/admin/assets/ghost-68ea49029c6d45b4aa090f4e218917aa.css +0 -1
  134. package/core/built/admin/assets/ghost-dark-c9b38252afc29364507e8c92e4ba9933.css +0 -1
  135. /package/core/built/admin/assets/{chunk.462.b66cfed1f66c8d2678b2.js.LICENSE.txt → chunk.324.2c415c5d0691230623df.js.LICENSE.txt} +0 -0
@@ -8,7 +8,7 @@
8
8
  <title>Ghost Admin</title>
9
9
 
10
10
 
11
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%225.40%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22ember-websockets%22%3A%7B%22socketIO%22%3Atrue%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%7D" />
11
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%225.41%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22ember-websockets%22%3A%7B%22socketIO%22%3Atrue%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%7D" />
12
12
 
13
13
  <meta name="HandheldFriendly" content="True" />
14
14
  <meta name="MobileOptimized" content="320" />
@@ -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-68ea49029c6d45b4aa090f4e218917aa.css" title="light">
40
+ <link integrity="" rel="stylesheet" href="assets/ghost-4c8239333143ae4b8d6046cca482b7ce.css" title="light">
41
41
 
42
42
 
43
43
  </head>
@@ -57,8 +57,8 @@
57
57
  <div id="ember-basic-dropdown-wormhole"></div>
58
58
 
59
59
  <script src="assets/vendor-d08b4de6f990b9cd7b5a92d61952a5bb.js"></script>
60
- <script src="assets/chunk.462.b66cfed1f66c8d2678b2.js"></script>
61
- <script src="assets/chunk.143.28e9fe97bf250c9d07db.js"></script>
62
- <script src="assets/ghost-467b96c17c6bc0d06fa88e85074fbecf.js"></script>
60
+ <script src="assets/chunk.324.2c415c5d0691230623df.js"></script>
61
+ <script src="assets/chunk.143.78da682c0f256cf61289.js"></script>
62
+ <script src="assets/ghost-4b392979da29476ec2b63e8437f26a9a.js"></script>
63
63
  </body>
64
64
  </html>
@@ -2,7 +2,7 @@
2
2
  // Usage: `{{ghost_head}}`
3
3
  //
4
4
  // Outputs scripts and other assets at the top of a Ghost theme
5
- const {metaData, settingsCache, config, blogIcon, urlUtils, getFrontendKey} = require('../services/proxy');
5
+ const {labs, metaData, settingsCache, config, blogIcon, urlUtils, getFrontendKey} = require('../services/proxy');
6
6
  const {escapeExpression, SafeString} = require('../services/handlebars');
7
7
 
8
8
  // BAD REQUIRE
@@ -52,6 +52,7 @@ function getMembersHelper(data, frontendKey) {
52
52
 
53
53
  const colorString = (_.has(data, 'site._preview') && data.site.accent_color) ? data.site.accent_color : '';
54
54
  const attributes = {
55
+ i18n: labs.isSet('i18n'),
55
56
  ghost: urlUtils.getSiteUrl(),
56
57
  key: frontendKey,
57
58
  api: urlUtils.urlFor('api', {type: 'content'}, true)
@@ -37,7 +37,7 @@ module.exports = createTransactionalMigration(
37
37
 
38
38
  await knex('api_keys').insert({
39
39
  id: (new ObjectID()).toHexString(),
40
- type: 'core',
40
+ type: 'admin',
41
41
  secret: security.secret.create('admin'),
42
42
  role_id: role.id,
43
43
  integration_id: integration.id,
@@ -0,0 +1,22 @@
1
+ const {createAddColumnMigration, combineNonTransactionalMigrations} = require('../../utils');
2
+
3
+ module.exports = combineNonTransactionalMigrations(
4
+ createAddColumnMigration('newsletters', 'background_color', {
5
+ type: 'string',
6
+ maxlength: 50,
7
+ nullable: false,
8
+ defaultTo: 'light'
9
+ }),
10
+
11
+ createAddColumnMigration('newsletters', 'border_color', {
12
+ type: 'string',
13
+ maxlength: 50,
14
+ nullable: true
15
+ }),
16
+
17
+ createAddColumnMigration('newsletters', 'title_color', {
18
+ type: 'string',
19
+ maxlength: 50,
20
+ nullable: true
21
+ })
22
+ );
@@ -0,0 +1,36 @@
1
+ const {InternalServerError} = require('@tryghost/errors');
2
+ const logging = require('@tryghost/logging');
3
+ const {createTransactionalMigration} = require('../../utils');
4
+
5
+ module.exports = module.exports = createTransactionalMigration(
6
+ async function up(knex) {
7
+ logging.info('Updating Admin API key for "Self-Serve Migration Integration"');
8
+
9
+ const integration = await knex('integrations').where({
10
+ slug: 'self-serve-migration',
11
+ name: 'Self-Serve Migration Integration'
12
+ }).first();
13
+
14
+ if (!integration) {
15
+ throw new InternalServerError('Could not find "Self-Serve Migration Integration"');
16
+ }
17
+
18
+ const existingKey = await knex('api_keys').where({
19
+ integration_id: integration.id,
20
+ type: 'core'
21
+ }).first();
22
+
23
+ if (!existingKey) {
24
+ logging.warn('Admin API key for "Self-Serve Migration Integration" with type "core" does not exists');
25
+ return;
26
+ }
27
+
28
+ logging.info(`Updating API key type to "admin" for "Self-Serve Migration Integration" ${existingKey.id}`);
29
+ await knex('api_keys')
30
+ .update('type', 'admin')
31
+ .where('id', existingKey.id);
32
+ },
33
+ async function down() {
34
+ // noop as previous state was incorrect
35
+ }
36
+ );
@@ -41,6 +41,9 @@ module.exports = {
41
41
  show_comment_cta: {type: 'boolean', nullable: false, defaultTo: true},
42
42
  show_subscription_details: {type: 'boolean', nullable: false, defaultTo: false},
43
43
  show_latest_posts: {type: 'boolean', nullable: false, defaultTo: false},
44
+ background_color: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'light'},
45
+ border_color: {type: 'string', maxlength: 50, nullable: true},
46
+ title_color: {type: 'string', maxlength: 50, nullable: true},
44
47
  created_at: {type: 'dateTime', nullable: false},
45
48
  updated_at: {type: 'dateTime', nullable: true}
46
49
  },
@@ -26,6 +26,9 @@ const Newsletter = ghostBookshelf.Model.extend({
26
26
  show_comment_cta: true,
27
27
  show_subscription_details: false,
28
28
  show_latest_posts: false,
29
+ background_color: 'light',
30
+ border_color: null,
31
+ title_color: null,
29
32
  feedback_enabled: false
30
33
  };
31
34
  },
@@ -1,14 +1,36 @@
1
- //const debug = require('@tryghost/debug')('i18n');
2
- const i18n = require('@tryghost/i18n');
1
+ const debug = require('@tryghost/debug')('i18n');
2
+
3
+ /** @type {import('i18next').i18n} */
4
+ let i18nInstance;
3
5
 
4
6
  module.exports.init = function () {
5
- //const events = require('../lib/common/events');
6
- //const settingsCache = require('../../shared/settings-cache');
7
+ const i18n = require('@tryghost/i18n');
8
+ const events = require('../lib/common/events');
9
+ const settingsCache = require('../../shared/settings-cache');
10
+ const labs = require('../../shared/labs');
11
+
12
+ let locale = 'en';
13
+
14
+ if (labs.isSet('i18n')) {
15
+ locale = settingsCache.get('locale');
16
+ }
17
+
18
+ module.exports = i18nInstance = i18n(locale, 'ghost');
7
19
 
8
- module.exports = i18n(/* settingsCache.get('locale') */ 'en', 'ghost');
20
+ events.on('settings.labs.edited', () => {
21
+ if (labs.isSet('i18n')) {
22
+ debug('labs i18n enabled, updating i18n to', settingsCache.get('locale'));
23
+ i18nInstance.changeLanguage(settingsCache.get('locale'));
24
+ } else {
25
+ debug('labs i18n disabled, updating i18n to en');
26
+ i18nInstance.changeLanguage('en');
27
+ }
28
+ });
9
29
 
10
- /*events.on('settings.locale.edited', (model) => {
11
- debug('locale changed, updating i18n to', model.get('value'));
12
- i18nInstance.changeLanguage(model.get('value'));
13
- });*/
30
+ events.on('settings.locale.edited', (model) => {
31
+ if (labs.isSet('i18n')) {
32
+ debug('locale changed, updating i18n to', model.get('value'));
33
+ i18nInstance.changeLanguage(model.get('value'));
34
+ }
35
+ });
14
36
  };
@@ -81,8 +81,13 @@ module.exports = {
81
81
  * @returns {Promise<string>}
82
82
  */
83
83
  async renderText(report, recipient) {
84
+ // Filter out mentions with duplicate source url from the report
85
+ const uniqueMentions = report.mentions.filter((mention, index, self) => {
86
+ return self.findIndex(m => m.sourceUrl.href === mention.sourceUrl.href) === index;
87
+ });
88
+
84
89
  return staffService.api.emails.renderText('mention-report', {
85
- report: report,
90
+ mentions: uniqueMentions,
86
91
  recipient: recipient
87
92
  });
88
93
  }
@@ -139,7 +144,7 @@ module.exports = {
139
144
 
140
145
  const labs = require('../../../shared/labs');
141
146
  DomainEvents.subscribe(StartMentionEmailReportJob, () => {
142
- if (labs.isSet('webmentionEmails')) {
147
+ if (labs.isSet('webmentions')) {
143
148
  job.sendLatestReport();
144
149
  }
145
150
  });
@@ -19,7 +19,8 @@ const getPostServiceInstance = () => {
19
19
  models: {
20
20
  Post: models.Post,
21
21
  Newsletter: models.Newsletter,
22
- Label: models.Label
22
+ Label: models.Label,
23
+ Product: models.Product
23
24
  },
24
25
  getPostUrl(post) {
25
26
  const jsonModel = post.toJSON();
@@ -176,7 +176,7 @@
176
176
  },
177
177
  "portal": {
178
178
  "url": "https://cdn.jsdelivr.net/ghost/portal@~{version}/umd/portal.min.js",
179
- "version": "2.25"
179
+ "version": "2.26"
180
180
  },
181
181
  "sodoSearch": {
182
182
  "url": "https://cdn.jsdelivr.net/ghost/sodo-search@~{version}/umd/sodo-search.min.js",
@@ -60,5 +60,6 @@
60
60
  "fixtures": "test/utils/fixtures/fixtures",
61
61
  "defaultSettings": "test/utils/fixtures/default-settings-browser.json",
62
62
  "urlCache": "test/utils/fixtures/urls"
63
- }
63
+ },
64
+ "enableDeveloperExperiments": true
64
65
  }
@@ -13,7 +13,7 @@
13
13
  }
14
14
  },
15
15
  "logging": {
16
- "level": "fatal"
16
+ "level": "error"
17
17
  },
18
18
  "spam": {
19
19
  "user_login": {
@@ -12,7 +12,7 @@
12
12
  "port": 2369
13
13
  },
14
14
  "logging": {
15
- "level": "fatal"
15
+ "level": "error"
16
16
  },
17
17
  "spam": {
18
18
  "user_login": {
@@ -27,15 +27,16 @@ const GA_FEATURES = [
27
27
  // NOTE: this allowlist is meant to be used to filter out any unexpected
28
28
  // input for the "labs" setting value
29
29
  const BETA_FEATURES = [
30
+ 'i18n',
30
31
  'activitypub',
31
32
  'webmentions'
32
33
  ];
33
34
 
34
35
  const ALPHA_FEATURES = [
35
36
  'urlCache',
37
+ 'migrateApp',
36
38
  'lexicalEditor',
37
39
  'websockets',
38
- 'webmentionEmails',
39
40
  'stripeAutomaticTax',
40
41
  'makingItRain'
41
42
  ];