ghost 4.39.0 → 4.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 (59) hide show
  1. package/Gruntfile.js +1 -1
  2. package/core/built/assets/{ghost-dark-498ff8339a89bb68c3f78f59bee4146e.css → ghost-dark-6fbe502f2bb2cde92e15b2f1a9da57a0.css} +1 -1
  3. package/core/built/assets/{ghost.min-77b93478f83b0def6ddc5a4f23ce963e.css → ghost.min-09301e5bd933cf6d24368e98a4d898a9.css} +1 -1
  4. package/core/built/assets/{ghost.min-e6559d901897066aa6a6d4145e3728ed.js → ghost.min-ee1d1d48a30dbd67513f647f360b39e3.js} +220 -225
  5. package/core/built/assets/img/themes/Headline-c5070cf549e797a6a72b87237caa1617.jpg +0 -0
  6. package/core/built/assets/{vendor.min-c39476bced9adb98ee2b292d01c7a8f4.js → vendor.min-9094db77ba3190cb10876f8e42e1d90d.js} +153 -143
  7. package/core/frontend/public/ghost.min.css +1 -1
  8. package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +3 -1
  9. package/core/server/api/canary/identities.js +0 -1
  10. package/core/server/api/canary/members.js +2 -6
  11. package/core/server/api/canary/utils/serializers/input/tiers.js +17 -0
  12. package/core/server/api/canary/utils/serializers/output/actions.js +2 -2
  13. package/core/server/api/canary/utils/serializers/output/authentication.js +3 -3
  14. package/core/server/api/canary/utils/serializers/output/authors.js +3 -3
  15. package/core/server/api/canary/utils/serializers/output/email-posts.js +2 -2
  16. package/core/server/api/canary/utils/serializers/output/emails.js +3 -3
  17. package/core/server/api/canary/utils/serializers/output/images.js +2 -2
  18. package/core/server/api/canary/utils/serializers/output/integrations.js +5 -6
  19. package/core/server/api/canary/utils/serializers/output/labels.js +3 -3
  20. package/core/server/api/canary/utils/serializers/output/mappers/actions.js +7 -0
  21. package/core/server/api/canary/utils/serializers/output/mappers/emails.js +17 -0
  22. package/core/server/api/canary/utils/serializers/output/mappers/images.js +5 -0
  23. package/core/server/api/canary/utils/serializers/output/mappers/index.js +12 -0
  24. package/core/server/api/canary/utils/serializers/output/mappers/integrations.js +13 -0
  25. package/core/server/api/canary/utils/serializers/output/mappers/labels.js +4 -0
  26. package/core/server/api/canary/utils/serializers/output/mappers/pages.js +11 -0
  27. package/core/server/api/canary/utils/serializers/output/mappers/posts.js +101 -0
  28. package/core/server/api/canary/utils/serializers/output/mappers/settings.js +37 -0
  29. package/core/server/api/canary/utils/serializers/output/mappers/tags.js +11 -0
  30. package/core/server/api/canary/utils/serializers/output/mappers/users.js +12 -0
  31. package/core/server/api/canary/utils/serializers/output/members.js +2 -7
  32. package/core/server/api/canary/utils/serializers/output/pages.js +3 -3
  33. package/core/server/api/canary/utils/serializers/output/posts.js +3 -3
  34. package/core/server/api/canary/utils/serializers/output/preview.js +2 -2
  35. package/core/server/api/canary/utils/serializers/output/settings.js +2 -2
  36. package/core/server/api/canary/utils/serializers/output/tags.js +3 -3
  37. package/core/server/api/canary/utils/serializers/output/users.js +3 -3
  38. package/core/server/data/exporter/table-lists.js +1 -0
  39. package/core/server/data/migrations/versions/4.40/2022-03-07-14-37-add-members-cancel-events-table.js +8 -0
  40. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-offers-admin-integration-permission-roles.js +23 -0
  41. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-tiers-admin-integration-permission-roles.js +20 -0
  42. package/core/server/data/schema/fixtures/fixtures.json +3 -1
  43. package/core/server/data/schema/schema.js +6 -0
  44. package/core/server/models/member-cancel-event.js +28 -0
  45. package/core/server/services/mega/template.js +1 -0
  46. package/core/server/services/members/api.js +1 -0
  47. package/core/server/services/oembed.js +2 -1
  48. package/core/server/services/themes/validate.js +3 -3
  49. package/core/server/web/admin/views/default-prod.html +4 -4
  50. package/core/server/web/admin/views/default.html +4 -4
  51. package/core/server/web/api/app.js +3 -3
  52. package/core/server/web/api/canary/admin/middleware.js +2 -0
  53. package/core/shared/config/defaults.json +2 -2
  54. package/core/shared/config/overrides.json +5 -1
  55. package/core/shared/labs.js +3 -3
  56. package/package.json +23 -23
  57. package/yarn.lock +298 -595
  58. package/core/server/api/canary/utils/serializers/output/utils/mapper.js +0 -213
  59. package/core/server/frontend/ghost.min.css +0 -1
@@ -1,4 +1,4 @@
1
- const mapper = require('./utils/mapper');
1
+ const mappers = require('./mappers');
2
2
  const membersService = require('../../../../../services/members');
3
3
 
4
4
  module.exports = {
@@ -8,7 +8,7 @@ module.exports = {
8
8
  });
9
9
  const tiers = tiersModels.data ? tiersModels.data.map(tierModel => tierModel.toJSON()) : [];
10
10
 
11
- const data = await mapper.mapPost(model, frame, {tiers});
11
+ const data = await mappers.posts(model, frame, {tiers});
12
12
  frame.response = {
13
13
  preview: [data]
14
14
  };
@@ -1,6 +1,6 @@
1
1
  const _ = require('lodash');
2
2
  const utils = require('../../index');
3
- const mapper = require('./utils/mapper');
3
+ const mappers = require('./mappers');
4
4
  const _private = {};
5
5
 
6
6
  /**
@@ -34,7 +34,7 @@ module.exports = {
34
34
  }
35
35
 
36
36
  frame.response = {
37
- settings: mapper.mapSettings(filteredSettings, frame),
37
+ settings: mappers.settings(filteredSettings, frame),
38
38
  meta: {}
39
39
  };
40
40
 
@@ -1,5 +1,5 @@
1
1
  const debug = require('@tryghost/debug')('api:canary:utils:serializers:output:tags');
2
- const mapper = require('./utils/mapper');
2
+ const mappers = require('./mappers');
3
3
 
4
4
  module.exports = {
5
5
  all(models, apiConfig, frame) {
@@ -11,7 +11,7 @@ module.exports = {
11
11
 
12
12
  if (models.meta) {
13
13
  frame.response = {
14
- tags: models.data.map(model => mapper.mapTag(model, frame)),
14
+ tags: models.data.map(model => mappers.tags(model, frame)),
15
15
  meta: models.meta
16
16
  };
17
17
 
@@ -19,7 +19,7 @@ module.exports = {
19
19
  }
20
20
 
21
21
  frame.response = {
22
- tags: [mapper.mapTag(models, frame)]
22
+ tags: [mappers.tags(models, frame)]
23
23
  };
24
24
  }
25
25
  };
@@ -1,6 +1,6 @@
1
1
  const debug = require('@tryghost/debug')('api:canary:utils:serializers:output:users');
2
2
  const tpl = require('@tryghost/tpl');
3
- const mapper = require('./utils/mapper');
3
+ const mappers = require('./mappers');
4
4
 
5
5
  const messages = {
6
6
  pwdChangedSuccessfully: 'Password changed successfully.'
@@ -11,7 +11,7 @@ module.exports = {
11
11
  debug('browse');
12
12
 
13
13
  frame.response = {
14
- users: models.data.map(model => mapper.mapUser(model, frame)),
14
+ users: models.data.map(model => mappers.users(model, frame)),
15
15
  meta: models.meta
16
16
  };
17
17
  },
@@ -20,7 +20,7 @@ module.exports = {
20
20
  debug('read');
21
21
 
22
22
  frame.response = {
23
- users: [mapper.mapUser(model, frame)]
23
+ users: [mappers.users(model, frame)]
24
24
  };
25
25
  },
26
26
 
@@ -31,6 +31,7 @@ const BACKUP_TABLES = [
31
31
  'mobiledoc_revisions',
32
32
  'email_batches',
33
33
  'email_recipients',
34
+ 'members_cancel_events',
34
35
  'members_payment_events',
35
36
  'members_login_events',
36
37
  'members_email_change_events',
@@ -0,0 +1,8 @@
1
+ const {addTable} = require('../../utils');
2
+
3
+ module.exports = addTable('members_cancel_events', {
4
+ id: {type: 'string', maxlength: 24, nullable: false, primary: true},
5
+ member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
6
+ from_plan: {type: 'string', maxlength: 255, nullable: false},
7
+ created_at: {type: 'dateTime', nullable: false}
8
+ });
@@ -0,0 +1,23 @@
1
+ const {
2
+ combineTransactionalMigrations,
3
+ addPermissionToRole
4
+ } = require('../../utils');
5
+
6
+ module.exports = combineTransactionalMigrations(
7
+ addPermissionToRole({
8
+ permission: 'Browse offers',
9
+ role: 'Admin Integration'
10
+ }),
11
+ addPermissionToRole({
12
+ permission: 'Read offers',
13
+ role: 'Admin Integration'
14
+ }),
15
+ addPermissionToRole({
16
+ permission: 'Edit offers',
17
+ role: 'Admin Integration'
18
+ }),
19
+ addPermissionToRole({
20
+ permission: 'Add offers',
21
+ role: 'Admin Integration'
22
+ })
23
+ );
@@ -0,0 +1,20 @@
1
+ const {combineTransactionalMigrations, addPermissionToRole} = require('../../utils');
2
+
3
+ module.exports = combineTransactionalMigrations(
4
+ addPermissionToRole({
5
+ permission: 'Browse Products',
6
+ role: 'Admin Integration'
7
+ }),
8
+ addPermissionToRole({
9
+ permission: 'Read Products',
10
+ role: 'Admin Integration'
11
+ }),
12
+ addPermissionToRole({
13
+ permission: 'Edit Products',
14
+ role: 'Admin Integration'
15
+ }),
16
+ addPermissionToRole({
17
+ permission: 'Add Products',
18
+ role: 'Admin Integration'
19
+ })
20
+ );
@@ -668,7 +668,9 @@
668
668
  "label": "all",
669
669
  "email_preview": "all",
670
670
  "email": "all",
671
- "snippet": "all"
671
+ "snippet": "all",
672
+ "product": ["browse", "read", "add", "edit"],
673
+ "offer": ["browse", "read", "add", "edit"]
672
674
  },
673
675
  "Editor": {
674
676
  "notification": "all",
@@ -438,6 +438,12 @@ module.exports = {
438
438
  product_id: {type: 'string', maxlength: 24, nullable: false, references: 'products.id', cascadeDelete: true},
439
439
  sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
440
440
  },
441
+ members_cancel_events: {
442
+ id: {type: 'string', maxlength: 24, nullable: false, primary: true},
443
+ member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
444
+ from_plan: {type: 'string', maxlength: 255, nullable: false},
445
+ created_at: {type: 'dateTime', nullable: false}
446
+ },
441
447
  members_payment_events: {
442
448
  id: {type: 'string', maxlength: 24, nullable: false, primary: true},
443
449
  member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
@@ -0,0 +1,28 @@
1
+ const errors = require('@tryghost/errors');
2
+ const ghostBookshelf = require('./base');
3
+
4
+ const MemberCancelEvent = ghostBookshelf.Model.extend({
5
+ tableName: 'members_cancel_events',
6
+
7
+ member() {
8
+ return this.belongsTo('Member', 'member_id', 'id');
9
+ }
10
+ }, {
11
+ async edit() {
12
+ throw new errors.IncorrectUsageError({message: 'Cannot edit MemberCancelEvent'});
13
+ },
14
+
15
+ async destroy() {
16
+ throw new errors.IncorrectUsageError({message: 'Cannot destroy MemberCancelEvent'});
17
+ }
18
+ });
19
+
20
+ const MemberCancelEvents = ghostBookshelf.Collection.extend({
21
+ model: MemberCancelEvent
22
+ });
23
+
24
+ module.exports = {
25
+ MemberCancelEvent: ghostBookshelf.model('MemberCancelEvent', MemberCancelEvent),
26
+ MemberCancelEvents: ghostBookshelf.collection('MemberCancelEvents', MemberCancelEvents)
27
+ };
28
+
@@ -263,6 +263,7 @@ code {
263
263
 
264
264
  pre {
265
265
  white-space: pre-wrap;
266
+ overflow: auto;
266
267
  background: #15212A;
267
268
  padding: 15px;
268
269
  border-radius: 3px;
@@ -177,6 +177,7 @@ function createApiInstance(config) {
177
177
  StripeCustomer: models.MemberStripeCustomer,
178
178
  StripeCustomerSubscription: models.StripeCustomerSubscription,
179
179
  Member: models.Member,
180
+ MemberCancelEvent: models.MemberCancelEvent,
180
181
  MemberSubscribeEvent: models.MemberSubscribeEvent,
181
182
  MemberPaidSubscriptionEvent: models.MemberPaidSubscriptionEvent,
182
183
  MemberLoginEvent: models.MemberLoginEvent,
@@ -9,7 +9,8 @@ const {CookieJar} = require('tough-cookie');
9
9
 
10
10
  const messages = {
11
11
  noUrlProvided: 'No url provided.',
12
- insufficientMetadata: 'URL contains insufficient metadata.'
12
+ insufficientMetadata: 'URL contains insufficient metadata.',
13
+ unknownProvider: 'No provider found for supplied URL.'
13
14
  };
14
15
 
15
16
  /**
@@ -28,20 +28,20 @@ const check = async function check(theme, isZip) {
28
28
  debug('zip mode');
29
29
  checkedTheme = await gscan.checkZip(theme, {
30
30
  keepExtractedDir: true,
31
- checkVersion: 'canary',
31
+ checkVersion: 'v4',
32
32
  labs: labs.getAll()
33
33
  });
34
34
  } else {
35
35
  debug('non-zip mode');
36
36
  checkedTheme = await gscan.check(theme.path, {
37
- checkVersion: 'canary',
37
+ checkVersion: 'v4',
38
38
  labs: labs.getAll()
39
39
  });
40
40
  }
41
41
 
42
42
  checkedTheme = gscan.format(checkedTheme, {
43
43
  onlyFatalErrors: config.get('env') === 'production',
44
- checkVersion: 'canary'
44
+ checkVersion: 'v4'
45
45
  });
46
46
 
47
47
  debug('End: Check');
@@ -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%2F%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%224.39%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%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%2F%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%224.41%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%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" />
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
  <link rel="stylesheet" href="assets/vendor.min-2c8ad32b7960bb605ebc20097fee5ebd.css">
41
- <link rel="stylesheet" href="assets/ghost.min-77b93478f83b0def6ddc5a4f23ce963e.css" title="light">
41
+ <link rel="stylesheet" href="assets/ghost.min-09301e5bd933cf6d24368e98a4d898a9.css" title="light">
42
42
 
43
43
 
44
44
 
@@ -56,8 +56,8 @@
56
56
  <div id="ember-basic-dropdown-wormhole"></div>
57
57
 
58
58
 
59
- <script src="assets/vendor.min-c39476bced9adb98ee2b292d01c7a8f4.js"></script>
60
- <script src="assets/ghost.min-e6559d901897066aa6a6d4145e3728ed.js"></script>
59
+ <script src="assets/vendor.min-9094db77ba3190cb10876f8e42e1d90d.js"></script>
60
+ <script src="assets/ghost.min-ee1d1d48a30dbd67513f647f360b39e3.js"></script>
61
61
 
62
62
  </body>
63
63
  </html>
@@ -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%2F%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%224.39%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%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%2F%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%224.41%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%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" />
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
  <link rel="stylesheet" href="assets/vendor.min-2c8ad32b7960bb605ebc20097fee5ebd.css">
41
- <link rel="stylesheet" href="assets/ghost.min-77b93478f83b0def6ddc5a4f23ce963e.css" title="light">
41
+ <link rel="stylesheet" href="assets/ghost.min-09301e5bd933cf6d24368e98a4d898a9.css" title="light">
42
42
 
43
43
 
44
44
 
@@ -56,8 +56,8 @@
56
56
  <div id="ember-basic-dropdown-wormhole"></div>
57
57
 
58
58
 
59
- <script src="assets/vendor.min-c39476bced9adb98ee2b292d01c7a8f4.js"></script>
60
- <script src="assets/ghost.min-e6559d901897066aa6a6d4145e3728ed.js"></script>
59
+ <script src="assets/vendor.min-9094db77ba3190cb10876f8e42e1d90d.js"></script>
60
+ <script src="assets/ghost.min-ee1d1d48a30dbd67513f647f360b39e3.js"></script>
61
61
 
62
62
  </body>
63
63
  </html>
@@ -22,12 +22,12 @@ module.exports = function setupApiApp() {
22
22
  apiApp.lazyUse(urlUtils.getVersionPath({version: 'v4', type: 'content'}), require('./canary/content/app'));
23
23
  apiApp.lazyUse(urlUtils.getVersionPath({version: 'v4', type: 'admin'}), require('./canary/admin/app'));
24
24
 
25
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'v5', type: 'content'}), require('./canary/content/app'));
26
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'v5', type: 'admin'}), require('./canary/admin/app'));
27
+
25
28
  apiApp.lazyUse(urlUtils.getVersionPath({version: 'canary', type: 'content'}), require('./canary/content/app'));
26
29
  apiApp.lazyUse(urlUtils.getVersionPath({version: 'canary', type: 'admin'}), require('./canary/admin/app'));
27
30
 
28
- apiApp.lazyUse('/content/', require('./canary/content/app'));
29
- apiApp.lazyUse('/admin/', require('./canary/admin/app'));
30
-
31
31
  // Error handling for requests to non-existent API versions
32
32
  apiApp.use(errorHandler.resourceNotFound);
33
33
  apiApp.use(errorHandler.handleJSONResponse(sentry));
@@ -29,6 +29,8 @@ const notImplemented = function (req, res, next) {
29
29
  users: ['GET'],
30
30
  themes: ['POST', 'PUT'],
31
31
  members: ['GET', 'PUT', 'DELETE', 'POST'],
32
+ tiers: ['GET', 'PUT', 'POST'],
33
+ offers: ['GET', 'PUT', 'POST'],
32
34
  config: ['GET'],
33
35
  schedules: ['PUT'],
34
36
  files: ['POST'],
@@ -128,8 +128,8 @@
128
128
  "emailAnalytics": true
129
129
  },
130
130
  "portal": {
131
- "url": "https://unpkg.com/@tryghost/portal@~1.16.0/umd/portal.min.js",
132
- "version": "1.16"
131
+ "url": "https://unpkg.com/@tryghost/portal@~1.17.0/umd/portal.min.js",
132
+ "version": "1.17"
133
133
  },
134
134
  "tenor": {
135
135
  "publicReadOnlyApiKey": null,
@@ -79,12 +79,16 @@
79
79
  },
80
80
  "api": {
81
81
  "versions": {
82
- "all": ["v2", "v3", "v4", "canary"],
82
+ "all": ["v2", "v3", "v4", "v5", "canary"],
83
83
  "default": "v4",
84
84
  "canary": {
85
85
  "admin": "canary/admin",
86
86
  "content": "canary/content"
87
87
  },
88
+ "v5": {
89
+ "admin": "admin",
90
+ "content": "content"
91
+ },
88
92
  "v4": {
89
93
  "admin": "v4/admin",
90
94
  "content": "v4/content"
@@ -20,7 +20,8 @@ const GA_FEATURES = [
20
20
  'tierName',
21
21
  'selectablePortalLinks',
22
22
  'membersTableStatus',
23
- 'improvedOnboarding'
23
+ 'improvedOnboarding',
24
+ 'membersActivityFeed'
24
25
  ];
25
26
 
26
27
  // NOTE: this allowlist is meant to be used to filter out any unexpected
@@ -34,8 +35,7 @@ const ALPHA_FEATURES = [
34
35
  'membersActivity',
35
36
  'urlCache',
36
37
  'beforeAfterCard',
37
- 'tweetGridCard',
38
- 'membersActivityFeed'
38
+ 'tweetGridCard'
39
39
  ];
40
40
 
41
41
  module.exports.GA_KEYS = [...GA_FEATURES];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "4.39.0",
3
+ "version": "4.41.0",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -57,7 +57,7 @@
57
57
  "dependencies": {
58
58
  "@sentry/node": "6.18.2",
59
59
  "@tryghost/adapter-manager": "0.2.28",
60
- "@tryghost/admin-api-schema": "2.11.0",
60
+ "@tryghost/admin-api-schema": "2.12.0",
61
61
  "@tryghost/bookshelf-plugins": "0.3.11",
62
62
  "@tryghost/bootstrap-socket": "0.2.17",
63
63
  "@tryghost/color-utils": "0.1.10",
@@ -81,14 +81,14 @@
81
81
  "@tryghost/kg-mobiledoc-html-renderer": "5.3.4",
82
82
  "@tryghost/limit-service": "1.0.10",
83
83
  "@tryghost/logging": "2.0.4",
84
- "@tryghost/magic-link": "1.0.20",
84
+ "@tryghost/magic-link": "1.0.21",
85
85
  "@tryghost/member-events": "0.4.0",
86
- "@tryghost/members-api": "5.1.1",
86
+ "@tryghost/members-api": "5.4.0",
87
87
  "@tryghost/members-events-service": "0.3.1",
88
88
  "@tryghost/members-importer": "0.5.3",
89
- "@tryghost/members-offers": "0.10.8",
89
+ "@tryghost/members-offers": "0.10.9",
90
90
  "@tryghost/members-ssr": "1.0.22",
91
- "@tryghost/members-stripe-service": "0.9.0",
91
+ "@tryghost/members-stripe-service": "0.9.1",
92
92
  "@tryghost/metrics": "1.0.6",
93
93
  "@tryghost/minifier": "0.1.11",
94
94
  "@tryghost/mw-error-handler": "0.1.4",
@@ -119,7 +119,7 @@
119
119
  "bookshelf": "1.2.0",
120
120
  "bookshelf-relations": "2.4.0",
121
121
  "brute-knex": "4.0.1",
122
- "bson-objectid": "2.0.2",
122
+ "bson-objectid": "2.0.3",
123
123
  "bthreads": "0.5.1",
124
124
  "cheerio": "0.22.0",
125
125
  "compression": "1.7.4",
@@ -149,19 +149,19 @@
149
149
  "juice": "8.0.0",
150
150
  "keypair": "1.0.4",
151
151
  "knex": "0.21.21",
152
- "knex-migrator": "4.2.2",
152
+ "knex-migrator": "4.2.3",
153
153
  "lodash": "4.17.21",
154
154
  "luxon": "2.3.1",
155
155
  "mailgun-js": "0.22.0",
156
- "metascraper": "5.25.8",
157
- "metascraper-author": "5.25.8",
158
- "metascraper-description": "5.25.8",
159
- "metascraper-image": "5.25.8",
160
- "metascraper-logo": "5.25.8",
161
- "metascraper-logo-favicon": "5.25.8",
162
- "metascraper-publisher": "5.25.8",
163
- "metascraper-title": "5.25.8",
164
- "metascraper-url": "5.25.8",
156
+ "metascraper": "5.26.0",
157
+ "metascraper-author": "5.26.0",
158
+ "metascraper-description": "5.26.0",
159
+ "metascraper-image": "5.26.0",
160
+ "metascraper-logo": "5.26.0",
161
+ "metascraper-logo-favicon": "5.26.0",
162
+ "metascraper-publisher": "5.26.0",
163
+ "metascraper-title": "5.26.0",
164
+ "metascraper-url": "5.26.0",
165
165
  "moment": "2.24.0",
166
166
  "moment-timezone": "0.5.23",
167
167
  "multer": "1.4.4",
@@ -187,12 +187,12 @@
187
187
  },
188
188
  "devDependencies": {
189
189
  "@lodder/grunt-postcss": "3.1.1",
190
- "@playwright/test": "1.19.2",
190
+ "@playwright/test": "1.20.0",
191
191
  "@tryghost/express-test": "0.6.1",
192
192
  "c8": "7.11.0",
193
193
  "coffeescript": "2.6.1",
194
- "cssnano": "5.1.2",
195
- "eslint": "8.10.0",
194
+ "cssnano": "5.1.4",
195
+ "eslint": "8.11.0",
196
196
  "eslint-plugin-ghost": "2.13.0",
197
197
  "grunt": "1.4.1",
198
198
  "grunt-bg-shell": "2.3.3",
@@ -206,12 +206,12 @@
206
206
  "grunt-subgrunt": "1.3.0",
207
207
  "grunt-update-submodules": "0.4.1",
208
208
  "jwks-rsa": "2.0.5",
209
- "mocha": "9.2.1",
209
+ "mocha": "9.2.2",
210
210
  "mocha-slow-test-reporter": "0.1.2",
211
211
  "mock-knex": "0.4.10",
212
212
  "nock": "13.2.4",
213
- "papaparse": "5.3.1",
214
- "postcss": "8.4.8",
213
+ "papaparse": "5.3.2",
214
+ "postcss": "8.4.12",
215
215
  "rewire": "6.0.0",
216
216
  "should": "13.2.3",
217
217
  "sinon": "13.0.1",