ghost 4.22.4 → 4.25.1

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 (170) hide show
  1. package/.eslintrc.js +39 -0
  2. package/content/themes/casper/assets/built/casper.js +1 -1
  3. package/content/themes/casper/assets/built/casper.js.map +1 -1
  4. package/content/themes/casper/assets/built/global.css +1 -1
  5. package/content/themes/casper/assets/built/global.css.map +1 -1
  6. package/content/themes/casper/assets/built/screen.css +1 -1
  7. package/content/themes/casper/assets/built/screen.css.map +1 -1
  8. package/content/themes/casper/assets/css/global.css +6 -1
  9. package/content/themes/casper/assets/css/screen.css +32 -216
  10. package/content/themes/casper/default.hbs +2 -2
  11. package/content/themes/casper/package.json +3 -2
  12. package/content/themes/casper/post.hbs +1 -1
  13. package/content/themes/casper/yarn.lock +173 -123
  14. package/core/app.js +12 -1
  15. package/core/boot.js +33 -19
  16. package/core/bridge.js +10 -10
  17. package/core/built/assets/ghost-dark-f67240a9636407594be38571c615629c.css +1 -0
  18. package/core/built/assets/{ghost.min-2e3e64eb258cf424c59c3e308b4bc6e6.js → ghost.min-3441c3282e390002626a2dc1d7586185.js} +544 -619
  19. package/core/built/assets/ghost.min-ee5bd95a831378b4c8ccefb37d26eac0.css +1 -0
  20. package/core/built/assets/icons/audio-upload.svg +8 -0
  21. package/core/built/assets/{vendor.min-c9002845b6c30ac978abdadde9f33d7c.js → vendor.min-6fc912d1248c906f95efad2cb3eebb7d.js} +2656 -2118
  22. package/core/frontend/apps/amp/lib/helpers/amp_content.js +2 -2
  23. package/core/frontend/apps/amp/lib/views/amp.hbs +70 -0
  24. package/core/frontend/apps/private-blogging/index.js +1 -1
  25. package/core/frontend/helpers/url.js +18 -1
  26. package/core/frontend/services/apps/index.js +1 -1
  27. package/core/frontend/services/apps/loader.js +3 -3
  28. package/core/frontend/services/card-assets/index.js +0 -12
  29. package/core/frontend/services/card-assets/service.js +22 -21
  30. package/core/frontend/services/helpers/handlebars.js +1 -1
  31. package/core/frontend/services/theme-engine/middleware/ensure-active-theme.js +34 -0
  32. package/core/frontend/services/theme-engine/middleware/index.js +6 -0
  33. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +116 -0
  34. package/core/frontend/services/theme-engine/middleware/update-local-template-data.js +9 -0
  35. package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +57 -0
  36. package/core/frontend/src/cards/css/blockquote.css +29 -0
  37. package/core/frontend/src/cards/css/bookmark.css +7 -0
  38. package/core/frontend/src/cards/css/button.css +4 -0
  39. package/core/frontend/src/cards/css/callout.css +23 -15
  40. package/core/frontend/src/cards/css/gallery.css +13 -3
  41. package/core/frontend/src/cards/css/toggle.css +36 -16
  42. package/core/frontend/web/middleware/error-handler.js +93 -0
  43. package/core/frontend/web/middleware/handle-image-sizes.js +3 -6
  44. package/core/frontend/web/middleware/index.js +1 -0
  45. package/core/frontend/web/middleware/serve-public-file.js +25 -8
  46. package/core/frontend/web/site.js +2 -5
  47. package/core/server/adapters/scheduling/SchedulingDefault.js +2 -2
  48. package/core/server/adapters/storage/LocalStorageBase.js +2 -2
  49. package/core/server/api/canary/db.js +2 -2
  50. package/core/server/api/canary/media.js +3 -2
  51. package/core/server/api/canary/oembed.js +16 -1
  52. package/core/server/api/canary/session.js +1 -1
  53. package/core/server/api/canary/slugs.js +1 -1
  54. package/core/server/api/canary/utils/permissions.js +2 -2
  55. package/core/server/api/canary/utils/serializers/output/config.js +2 -6
  56. package/core/server/api/v2/db.js +2 -2
  57. package/core/server/api/v2/session.js +1 -1
  58. package/core/server/api/v2/slugs.js +1 -1
  59. package/core/server/api/v2/utils/permissions.js +2 -2
  60. package/core/server/api/v3/db.js +2 -2
  61. package/core/server/api/v3/session.js +1 -1
  62. package/core/server/api/v3/slugs.js +1 -1
  63. package/core/server/api/v3/utils/permissions.js +2 -2
  64. package/core/server/data/db/state-manager.js +4 -4
  65. package/core/server/data/exporter/export-filename.js +1 -1
  66. package/core/server/data/importer/handlers/json.js +1 -1
  67. package/core/server/data/importer/import-manager.js +1 -1
  68. package/core/server/data/importer/importers/data/base.js +1 -1
  69. package/core/server/data/migrations/utils.js +2 -2
  70. package/core/server/data/migrations/versions/1.25/1-update-koenig-beta-html.js +1 -0
  71. package/core/server/data/migrations/versions/3.1/08-add-uuid-values-to-members.js +1 -0
  72. package/core/server/data/migrations/versions/3.22/02-settings-key-renames.js +2 -0
  73. package/core/server/data/migrations/versions/3.22/05-migrate-members-subscription-settings.js +3 -0
  74. package/core/server/data/migrations/versions/3.22/06-migrate-stripe-connect-settings.js +2 -0
  75. package/core/server/data/migrations/versions/3.23/01-migrate-bulk-email-settings.js +1 -0
  76. package/core/server/data/migrations/versions/3.29/01-remove-duplicate-subscriptions.js +2 -0
  77. package/core/server/data/migrations/versions/3.29/02-remove-duplicate-customers.js +2 -0
  78. package/core/server/data/migrations/versions/3.38/04-populate-recipient-filter-column.js +2 -0
  79. package/core/server/data/migrations/versions/4.0/01-update-mobiledoc.js +2 -0
  80. package/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +4 -0
  81. package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +1 -0
  82. package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +1 -0
  83. package/core/server/data/migrations/versions/4.0/18-transform-urls-absolute-to-transform-ready.js +5 -0
  84. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +1 -0
  85. package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +1 -0
  86. package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +2 -1
  87. package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +1 -0
  88. package/core/server/data/migrations/versions/4.14/01-fix-comped-member-statuses.js +3 -0
  89. package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +1 -0
  90. package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +2 -0
  91. package/core/server/data/migrations/versions/4.23/01-truncate-offer-names.js +59 -0
  92. package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +1 -0
  93. package/core/server/data/migrations/versions/4.4/01-restore-free-members-signup-setting-from-backup.js +1 -0
  94. package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +1 -0
  95. package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +1 -0
  96. package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +1 -0
  97. package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +1 -0
  98. package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +1 -0
  99. package/core/server/data/schema/commands.js +2 -2
  100. package/core/server/ghost-server.js +2 -2
  101. package/core/server/lib/image/image-size.js +2 -2
  102. package/core/server/models/base/listeners.js +2 -2
  103. package/core/server/models/member-email-change-event.js +2 -2
  104. package/core/server/models/member-login-event.js +2 -2
  105. package/core/server/models/member-paid-subscription-event.js +3 -3
  106. package/core/server/models/member-payment-event.js +3 -3
  107. package/core/server/models/member-product-event.js +6 -6
  108. package/core/server/models/member-status-event.js +5 -3
  109. package/core/server/models/member-subscribe-event.js +9 -3
  110. package/core/server/models/relations/authors.js +1 -1
  111. package/core/server/models/settings.js +1 -1
  112. package/core/server/services/auth/passwordreset.js +1 -1
  113. package/core/server/services/auth/setup.js +1 -1
  114. package/core/server/services/email-analytics/jobs/index.js +1 -1
  115. package/core/server/services/mega/mega.js +6 -4
  116. package/core/server/services/mega/template.js +31 -12
  117. package/core/server/services/members/api.js +22 -0
  118. package/core/server/services/members/config.js +1 -1
  119. package/core/server/services/members/emails/signup-paid.js +168 -0
  120. package/core/server/services/members/service.js +6 -2
  121. package/core/server/services/members/stripe-connect.js +4 -2
  122. package/core/server/services/nft-oembed.js +6 -1
  123. package/core/server/services/oembed.js +36 -28
  124. package/core/server/services/permissions/can-this.js +1 -1
  125. package/core/server/services/redirects/api.js +20 -25
  126. package/core/server/services/redirects/index.js +18 -10
  127. package/core/server/services/redirects/utils.js +14 -0
  128. package/core/server/services/redirects/validation.js +10 -0
  129. package/core/server/services/route-settings/default-settings-manager.js +1 -1
  130. package/core/server/services/route-settings/index.js +40 -17
  131. package/core/server/services/route-settings/route-settings.js +120 -115
  132. package/core/server/services/route-settings/settings-loader.js +18 -36
  133. package/core/server/services/route-settings/yaml-parser.js +1 -1
  134. package/core/server/services/slack.js +1 -1
  135. package/core/server/services/themes/activation-bridge.js +3 -3
  136. package/core/server/services/themes/storage.js +2 -2
  137. package/core/server/services/twitter-embed.js +80 -0
  138. package/core/server/services/url/LocalFileCache.js +75 -0
  139. package/core/server/services/url/UrlService.js +15 -47
  140. package/core/server/services/url/index.js +17 -4
  141. package/core/server/services/xmlrpc.js +2 -2
  142. package/core/server/web/admin/app.js +2 -5
  143. package/core/server/web/admin/controller.js +35 -12
  144. package/core/server/web/admin/middleware/redirect-admin-urls.js +15 -0
  145. package/core/server/web/admin/views/default-prod.html +4 -4
  146. package/core/server/web/admin/views/default.html +4 -4
  147. package/core/server/web/api/canary/admin/app.js +0 -3
  148. package/core/server/web/api/canary/admin/middleware.js +1 -1
  149. package/core/server/web/api/canary/content/app.js +0 -3
  150. package/core/server/web/api/v2/admin/app.js +0 -3
  151. package/core/server/web/api/v2/admin/middleware.js +1 -1
  152. package/core/server/web/api/v2/content/app.js +0 -3
  153. package/core/server/web/api/v3/admin/app.js +0 -3
  154. package/core/server/web/api/v3/admin/middleware.js +1 -1
  155. package/core/server/web/api/v3/content/app.js +0 -3
  156. package/core/server/web/members/app.js +0 -3
  157. package/core/server/web/oauth/app.js +0 -4
  158. package/core/server/web/parent/app.js +17 -8
  159. package/core/server/web/shared/middleware/error-handler.js +57 -162
  160. package/core/server/web/shared/middleware/index.js +0 -4
  161. package/core/shared/config/defaults.json +7 -1
  162. package/core/shared/labs.js +10 -5
  163. package/core/shared/sentry.js +1 -1
  164. package/package.json +43 -42
  165. package/yarn.lock +802 -923
  166. package/content/themes/casper/assets/js/gallery-card.js +0 -24
  167. package/core/built/assets/ghost-dark-42cf6e0c730578940ec069bda45aea41.css +0 -1
  168. package/core/built/assets/ghost.min-fcf6a0738421f86c47c55f20d00c5ba9.css +0 -1
  169. package/core/frontend/services/theme-engine/middleware.js +0 -209
  170. package/core/server/web/shared/middleware/maintenance.js +0 -25
@@ -1,209 +0,0 @@
1
- const _ = require('lodash');
2
- const hbs = require('./engine');
3
- const urlUtils = require('../../../shared/url-utils');
4
- const {api} = require('../proxy');
5
- const errors = require('@tryghost/errors');
6
- const tpl = require('@tryghost/tpl');
7
- const settingsCache = require('../../../shared/settings-cache');
8
- const customThemeSettingsCache = require('../../../shared/custom-theme-settings-cache');
9
- const labs = require('../../../shared/labs');
10
- const activeTheme = require('./active');
11
- const preview = require('./preview');
12
-
13
- const messages = {
14
- missingTheme: 'The currently active theme "{theme}" is missing.'
15
- };
16
-
17
- // ### Ensure Active Theme
18
- // Ensure there's a properly set & mounted active theme before attempting to serve a site request
19
- // If there is no active theme, throw an error
20
- // Else, ensure the active theme is mounted
21
- function ensureActiveTheme(req, res, next) {
22
- // CASE: this means that the theme hasn't been loaded yet i.e. there is no active theme
23
- if (!activeTheme.get()) {
24
- // This is the one place we ACTUALLY throw an error for a missing theme as it's a request we cannot serve
25
- return next(new errors.InternalServerError({
26
- // We use the settingsCache here, because the setting will be set,
27
- // even if the theme itself is not usable because it is invalid or missing.
28
- message: tpl(messages.missingTheme, {theme: settingsCache.get('active_theme')})
29
- }));
30
- }
31
-
32
- // If the active theme has not yet been mounted, mount it into express
33
- if (!activeTheme.get().mounted) {
34
- activeTheme.get().mount(req.app);
35
- }
36
-
37
- next();
38
- }
39
-
40
- function calculateLegacyPriceData(products) {
41
- const defaultPrice = {
42
- amount: 0,
43
- currency: 'usd',
44
- interval: 'year',
45
- nickname: ''
46
- };
47
-
48
- function makePriceObject(price) {
49
- const numberAmount = 0 + price.amount;
50
- const dollarAmount = numberAmount ? Math.round(numberAmount / 100) : 0;
51
- return {
52
- valueOf() {
53
- return dollarAmount;
54
- },
55
- amount: numberAmount,
56
- currency: price.currency,
57
- nickname: price.name,
58
- interval: price.interval
59
- };
60
- }
61
-
62
- const defaultProduct = products[0] || {};
63
-
64
- const monthlyPrice = makePriceObject(defaultProduct.monthly_price || defaultPrice);
65
-
66
- const yearlyPrice = makePriceObject(defaultProduct.yearly_price || defaultPrice);
67
-
68
- const priceData = {
69
- monthly: monthlyPrice,
70
- yearly: yearlyPrice,
71
- currency: monthlyPrice ? monthlyPrice.currency : defaultPrice.currency
72
- };
73
-
74
- return priceData;
75
- }
76
-
77
- async function getProductAndPricesData() {
78
- try {
79
- const page = await api.canary.productsPublic.browse({
80
- include: ['monthly_price', 'yearly_price'],
81
- limit: 'all'
82
- });
83
-
84
- return page.products;
85
- } catch (err) {
86
- return [];
87
- }
88
- }
89
-
90
- function getSiteData() {
91
- let siteData = settingsCache.getPublic();
92
-
93
- // theme-only computed property added to @site
94
- if (settingsCache.get('members_signup_access') === 'none') {
95
- const escapedUrl = encodeURIComponent(urlUtils.urlFor({relativeUrl: '/rss/'}, true));
96
- siteData.signup_url = `https://feedly.com/i/subscription/feed/${escapedUrl}`;
97
- } else {
98
- siteData.signup_url = '#/portal';
99
- }
100
-
101
- return siteData;
102
- }
103
-
104
- async function updateGlobalTemplateOptions(req, res, next) {
105
- // Static information, same for every request unless the settings change
106
- // @TODO: bind this once and then update based on events?
107
- // @TODO: decouple theme layer from settings cache using the Content API
108
- const siteData = getSiteData();
109
- const labsData = labs.getAll();
110
-
111
- const themeData = {
112
- posts_per_page: activeTheme.get().config('posts_per_page'),
113
- image_sizes: activeTheme.get().config('image_sizes')
114
- };
115
- const themeSettingsData = customThemeSettingsCache.getAll();
116
- const productData = await getProductAndPricesData();
117
- const priceData = calculateLegacyPriceData(productData);
118
-
119
- let products = null;
120
- let product = null;
121
- if (productData.length === 1) {
122
- product = productData[0];
123
- } else {
124
- products = productData;
125
- }
126
-
127
- // @TODO: only do this if something changed?
128
- // @TODO: remove blog in a major where we are happy to break more themes
129
- {
130
- hbs.updateTemplateOptions({
131
- data: {
132
- blog: siteData,
133
- site: siteData,
134
- labs: labsData,
135
- config: themeData,
136
- price: priceData,
137
- product,
138
- products,
139
- custom: themeSettingsData
140
- }
141
- });
142
- }
143
-
144
- next();
145
- }
146
-
147
- function updateLocalTemplateData(req, res, next) {
148
- // Pass 'secure' flag to the view engine
149
- // so that templates can choose to render https or http 'url', see url utility
150
- res.locals.secure = req.secure;
151
-
152
- next();
153
- }
154
-
155
- function updateLocalTemplateOptions(req, res, next) {
156
- const localTemplateOptions = hbs.getLocalTemplateOptions(res.locals);
157
-
158
- // adjust @site.url for http/https based on the incoming request
159
- const siteData = {
160
- url: urlUtils.urlFor('home', {secure: req.secure, trailingSlash: false}, true)
161
- };
162
-
163
- // @TODO: it would be nicer if this was proper middleware somehow...
164
- const previewData = preview.handle(req, Object.keys(customThemeSettingsCache.getAll()));
165
-
166
- // strip custom off of preview data so it doesn't get merged into @site
167
- const customThemeSettingsPreviewData = previewData.custom;
168
- delete previewData.custom;
169
- let customData = {};
170
- if (labs.isSet('customThemeSettings')) {
171
- customData = customThemeSettingsPreviewData;
172
- }
173
-
174
- // update site data with any preview values from the request
175
- Object.assign(siteData, previewData);
176
-
177
- const member = req.member ? {
178
- uuid: req.member.uuid,
179
- email: req.member.email,
180
- name: req.member.name,
181
- firstname: req.member.name && req.member.name.split(' ')[0],
182
- avatar_image: req.member.avatar_image,
183
- subscriptions: req.member.subscriptions && req.member.subscriptions.map((sub) => {
184
- return Object.assign({}, sub, {
185
- default_payment_card_last4: sub.default_payment_card_last4 || '****'
186
- });
187
- }),
188
- paid: req.member.status !== 'free'
189
- } : null;
190
-
191
- hbs.updateLocalTemplateOptions(res.locals, _.merge({}, localTemplateOptions, {
192
- data: {
193
- member: member,
194
- site: siteData,
195
- custom: customData,
196
- // @deprecated: a gscan warning for @blog was added before 3.0 which replaced it with @site
197
- blog: siteData
198
- }
199
- }));
200
-
201
- next();
202
- }
203
-
204
- module.exports = [
205
- ensureActiveTheme,
206
- updateGlobalTemplateOptions,
207
- updateLocalTemplateData,
208
- updateLocalTemplateOptions
209
- ];
@@ -1,25 +0,0 @@
1
- const errors = require('@tryghost/errors');
2
- const config = require('../../../../shared/config');
3
- const tpl = require('@tryghost/tpl');
4
- const urlService = require('../../../services/url');
5
-
6
- const messages = {
7
- maintenance: 'Site is currently undergoing maintenance, please wait a moment then retry.',
8
- maintenanceUrlService: 'Site is starting up, please wait a moment then retry.'
9
- };
10
-
11
- module.exports = function maintenance(req, res, next) {
12
- if (config.get('maintenance').enabled) {
13
- return next(new errors.MaintenanceError({
14
- message: tpl(messages.maintenance)
15
- }));
16
- }
17
-
18
- if (!urlService.hasFinished()) {
19
- return next(new errors.MaintenanceError({
20
- message: tpl(messages.maintenanceUrlService)
21
- }));
22
- }
23
-
24
- next();
25
- };