ghost 4.22.3 → 4.25.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 (230) hide show
  1. package/.c8rc.json +24 -0
  2. package/.eslintrc.js +39 -0
  3. package/Gruntfile.js +0 -1
  4. package/content/public/README.md +3 -0
  5. package/content/themes/casper/assets/built/casper.js +1 -1
  6. package/content/themes/casper/assets/built/casper.js.map +1 -1
  7. package/content/themes/casper/assets/built/global.css +1 -1
  8. package/content/themes/casper/assets/built/global.css.map +1 -1
  9. package/content/themes/casper/assets/built/screen.css +1 -1
  10. package/content/themes/casper/assets/built/screen.css.map +1 -1
  11. package/content/themes/casper/assets/css/global.css +6 -1
  12. package/content/themes/casper/assets/css/screen.css +32 -216
  13. package/content/themes/casper/default.hbs +2 -2
  14. package/content/themes/casper/package.json +3 -2
  15. package/content/themes/casper/post.hbs +1 -1
  16. package/content/themes/casper/yarn.lock +173 -123
  17. package/core/app.js +12 -1
  18. package/core/boot.js +47 -28
  19. package/core/bridge.js +10 -10
  20. package/core/built/assets/{chunk.3.324fd0cc598c73650219.js → chunk.3.8f95b516d88ff4eec64c.js} +18 -18
  21. package/core/built/assets/ghost-dark-d690e732e17ffc794e2e59c1467ca282.css +1 -0
  22. package/core/built/assets/ghost.min-043bb7480a0810109b130f13b2a4235e.css +1 -0
  23. package/core/built/assets/{ghost.min-7da921f6c6cac3fe10da1ba104575440.js → ghost.min-bc72f685c1c9adc9885925c1412435a5.js} +563 -605
  24. package/core/built/assets/icons/audio-upload.svg +8 -0
  25. package/core/built/assets/icons/powered-by-tenor.svg +35 -0
  26. package/core/built/assets/icons/tenor.svg +7 -0
  27. package/core/built/assets/{vendor.min-413f887176a041e6dbf88214ca9a7481.js → vendor.min-d1234c632a54502777c34e50752fa3fc.js} +4622 -3631
  28. package/core/frontend/apps/amp/lib/helpers/amp_content.js +2 -2
  29. package/core/frontend/apps/amp/lib/views/amp.hbs +112 -0
  30. package/core/frontend/apps/private-blogging/index.js +1 -1
  31. package/core/frontend/apps/private-blogging/lib/router.js +1 -1
  32. package/core/frontend/services/apps/index.js +1 -1
  33. package/core/frontend/services/apps/loader.js +3 -3
  34. package/core/frontend/services/card-assets/index.js +0 -12
  35. package/core/frontend/services/card-assets/service.js +29 -28
  36. package/core/frontend/services/helpers/handlebars.js +1 -1
  37. package/core/frontend/services/routing/CollectionRouter.js +4 -5
  38. package/core/frontend/services/routing/EmailRouter.js +1 -1
  39. package/core/frontend/services/routing/ParentRouter.js +0 -8
  40. package/core/frontend/services/routing/PreviewRouter.js +1 -1
  41. package/core/frontend/services/routing/StaticPagesRouter.js +1 -1
  42. package/core/frontend/services/routing/StaticRoutesRouter.js +4 -4
  43. package/core/frontend/services/routing/TaxonomyRouter.js +3 -3
  44. package/core/frontend/services/routing/{middlewares → middleware}/index.js +0 -0
  45. package/core/frontend/services/routing/{middlewares → middleware}/page-param.js +0 -0
  46. package/core/frontend/services/routing/router-manager.js +7 -2
  47. package/core/frontend/services/rss/generate-feed.js +2 -1
  48. package/core/frontend/services/theme-engine/middleware/ensure-active-theme.js +34 -0
  49. package/core/frontend/services/theme-engine/middleware/index.js +6 -0
  50. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +116 -0
  51. package/core/frontend/services/theme-engine/middleware/update-local-template-data.js +9 -0
  52. package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +57 -0
  53. package/core/frontend/src/cards/css/bookmark.css +72 -47
  54. package/core/frontend/src/cards/css/button.css +4 -0
  55. package/core/frontend/src/cards/css/callout.css +40 -3
  56. package/core/frontend/src/cards/css/gallery.css +15 -10
  57. package/core/frontend/src/cards/css/nft.css +20 -11
  58. package/core/frontend/src/cards/css/toggle.css +58 -0
  59. package/core/frontend/src/cards/js/toggle.js +16 -0
  60. package/core/frontend/web/middleware/error-handler.js +93 -0
  61. package/core/frontend/web/middleware/handle-image-sizes.js +3 -6
  62. package/core/frontend/web/middleware/index.js +1 -0
  63. package/core/frontend/web/middleware/serve-public-file.js +39 -16
  64. package/core/frontend/web/site.js +11 -14
  65. package/core/server/adapters/scheduling/SchedulingDefault.js +2 -2
  66. package/core/server/adapters/storage/LocalStorageBase.js +2 -2
  67. package/core/server/api/canary/authentication.js +1 -1
  68. package/core/server/api/canary/db.js +2 -2
  69. package/core/server/api/canary/media.js +3 -2
  70. package/core/server/api/canary/oembed.js +16 -1
  71. package/core/server/api/canary/session.js +1 -1
  72. package/core/server/api/canary/slugs.js +1 -1
  73. package/core/server/api/canary/utils/permissions.js +2 -2
  74. package/core/server/api/canary/utils/serializers/output/config.js +2 -6
  75. package/core/server/api/v2/authentication.js +1 -1
  76. package/core/server/api/v2/db.js +2 -2
  77. package/core/server/api/v2/session.js +1 -1
  78. package/core/server/api/v2/slugs.js +1 -1
  79. package/core/server/api/v2/utils/permissions.js +2 -2
  80. package/core/server/api/v3/authentication.js +1 -1
  81. package/core/server/api/v3/db.js +2 -2
  82. package/core/server/api/v3/session.js +1 -1
  83. package/core/server/api/v3/slugs.js +1 -1
  84. package/core/server/api/v3/utils/permissions.js +2 -2
  85. package/core/server/data/db/connection.js +7 -0
  86. package/core/server/data/db/state-manager.js +4 -4
  87. package/core/server/data/exporter/export-filename.js +1 -1
  88. package/core/server/data/importer/handlers/json.js +1 -1
  89. package/core/server/data/importer/import-manager.js +1 -1
  90. package/core/server/data/importer/importers/data/base.js +1 -1
  91. package/core/server/data/importer/importers/data/data-importer.js +3 -3
  92. package/core/server/data/migrations/init/2-create-fixtures.js +3 -20
  93. package/core/server/data/migrations/utils.js +2 -2
  94. package/core/server/data/migrations/versions/1.21/1-add-contributor-role.js +5 -5
  95. package/core/server/data/migrations/versions/1.25/1-update-koenig-beta-html.js +1 -0
  96. package/core/server/data/migrations/versions/2.15/2-insert-zapier-integration.js +3 -3
  97. package/core/server/data/migrations/versions/2.2/3-insert-admin-integration-role.js +5 -5
  98. package/core/server/data/migrations/versions/2.27/1-insert-ghost-db-backup-role.js +5 -6
  99. package/core/server/data/migrations/versions/2.27/2-insert-db-backup-integration.js +3 -4
  100. package/core/server/data/migrations/versions/2.28/3-insert-ghost-scheduler-role.js +7 -7
  101. package/core/server/data/migrations/versions/2.28/4-insert-scheduler-integration.js +3 -3
  102. package/core/server/data/migrations/versions/3.1/08-add-uuid-values-to-members.js +1 -0
  103. package/core/server/data/migrations/versions/3.22/02-settings-key-renames.js +2 -0
  104. package/core/server/data/migrations/versions/3.22/05-migrate-members-subscription-settings.js +3 -0
  105. package/core/server/data/migrations/versions/3.22/06-migrate-stripe-connect-settings.js +2 -0
  106. package/core/server/data/migrations/versions/3.23/01-migrate-bulk-email-settings.js +1 -0
  107. package/core/server/data/migrations/versions/3.29/01-remove-duplicate-subscriptions.js +2 -0
  108. package/core/server/data/migrations/versions/3.29/02-remove-duplicate-customers.js +2 -0
  109. package/core/server/data/migrations/versions/3.38/04-populate-recipient-filter-column.js +2 -0
  110. package/core/server/data/migrations/versions/4.0/01-update-mobiledoc.js +2 -0
  111. package/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +4 -0
  112. package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +1 -0
  113. package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +1 -0
  114. package/core/server/data/migrations/versions/4.0/18-transform-urls-absolute-to-transform-ready.js +5 -0
  115. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +1 -0
  116. package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +1 -0
  117. package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +2 -1
  118. package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +1 -0
  119. package/core/server/data/migrations/versions/4.14/01-fix-comped-member-statuses.js +3 -0
  120. package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +1 -0
  121. package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +2 -0
  122. package/core/server/data/migrations/versions/4.23/01-truncate-offer-names.js +59 -0
  123. package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +1 -0
  124. package/core/server/data/migrations/versions/4.4/01-restore-free-members-signup-setting-from-backup.js +1 -0
  125. package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +1 -0
  126. package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +1 -0
  127. package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +1 -0
  128. package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +1 -0
  129. package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +1 -0
  130. package/core/server/data/schema/commands.js +2 -2
  131. package/core/server/data/schema/fixtures/fixture-manager.js +340 -0
  132. package/core/server/data/schema/fixtures/index.js +8 -2
  133. package/core/server/ghost-server.js +2 -2
  134. package/core/server/lib/image/image-size.js +2 -2
  135. package/core/server/models/base/listeners.js +2 -2
  136. package/core/server/models/member-email-change-event.js +2 -2
  137. package/core/server/models/member-login-event.js +2 -2
  138. package/core/server/models/member-paid-subscription-event.js +3 -3
  139. package/core/server/models/member-payment-event.js +3 -3
  140. package/core/server/models/member-product-event.js +6 -6
  141. package/core/server/models/member-status-event.js +5 -3
  142. package/core/server/models/member-subscribe-event.js +9 -3
  143. package/core/server/models/relations/authors.js +1 -1
  144. package/core/server/models/settings.js +1 -1
  145. package/core/server/services/auth/passwordreset.js +1 -1
  146. package/core/server/services/auth/setup.js +1 -1
  147. package/core/server/services/email-analytics/jobs/index.js +1 -1
  148. package/core/server/services/mega/mega.js +6 -4
  149. package/core/server/services/mega/post-email-serializer.js +5 -1
  150. package/core/server/services/mega/segment-parser.js +1 -2
  151. package/core/server/services/mega/template.js +52 -37
  152. package/core/server/services/members/api.js +22 -0
  153. package/core/server/services/members/config.js +1 -1
  154. package/core/server/services/members/emails/signup-paid.js +168 -0
  155. package/core/server/services/members/service.js +6 -2
  156. package/core/server/services/members/stripe-connect.js +4 -2
  157. package/core/server/services/nft-oembed.js +13 -22
  158. package/core/server/services/oembed.js +28 -24
  159. package/core/server/services/permissions/can-this.js +1 -1
  160. package/core/server/services/public-config/config.js +1 -1
  161. package/core/server/services/redirects/api.js +20 -25
  162. package/core/server/services/redirects/index.js +18 -10
  163. package/core/server/services/redirects/utils.js +14 -0
  164. package/core/server/services/redirects/validation.js +10 -0
  165. package/core/server/services/route-settings/default-settings-manager.js +1 -1
  166. package/core/server/services/route-settings/index.js +40 -17
  167. package/core/server/services/route-settings/route-settings.js +120 -115
  168. package/core/server/services/route-settings/settings-loader.js +18 -36
  169. package/core/server/services/route-settings/yaml-parser.js +1 -1
  170. package/core/server/services/slack.js +1 -1
  171. package/core/server/services/themes/activation-bridge.js +3 -3
  172. package/core/server/services/themes/storage.js +2 -2
  173. package/core/server/services/twitter-embed.js +80 -0
  174. package/core/server/services/url/LocalFileCache.js +75 -0
  175. package/core/server/services/url/Resources.js +8 -2
  176. package/core/server/services/url/UrlGenerator.js +23 -20
  177. package/core/server/services/url/UrlService.js +75 -63
  178. package/core/server/services/url/index.js +17 -3
  179. package/core/server/services/xmlrpc.js +2 -2
  180. package/core/server/web/admin/app.js +7 -10
  181. package/core/server/web/admin/controller.js +35 -12
  182. package/core/server/web/admin/middleware/redirect-admin-urls.js +15 -0
  183. package/core/server/web/admin/views/default-prod.html +4 -4
  184. package/core/server/web/admin/views/default.html +4 -4
  185. package/core/server/web/api/app.js +1 -1
  186. package/core/server/web/api/canary/admin/app.js +3 -6
  187. package/core/server/web/api/canary/admin/middleware.js +7 -7
  188. package/core/server/web/api/canary/admin/routes.js +5 -5
  189. package/core/server/web/api/canary/content/app.js +3 -6
  190. package/core/server/web/api/canary/content/middleware.js +3 -3
  191. package/core/server/web/api/v2/admin/app.js +3 -6
  192. package/core/server/web/api/v2/admin/middleware.js +7 -7
  193. package/core/server/web/api/v2/admin/routes.js +5 -5
  194. package/core/server/web/api/v2/content/app.js +3 -6
  195. package/core/server/web/api/v2/content/middleware.js +3 -3
  196. package/core/server/web/api/v3/admin/app.js +3 -6
  197. package/core/server/web/api/v3/admin/middleware.js +7 -7
  198. package/core/server/web/api/v3/admin/routes.js +5 -5
  199. package/core/server/web/api/v3/content/app.js +3 -6
  200. package/core/server/web/api/v3/content/middleware.js +3 -3
  201. package/core/server/web/members/app.js +6 -9
  202. package/core/server/web/oauth/app.js +0 -4
  203. package/core/server/web/parent/app.js +17 -9
  204. package/core/server/web/parent/frontend.js +1 -1
  205. package/core/server/web/shared/index.js +2 -2
  206. package/core/server/web/shared/{middlewares → middleware}/api/index.js +0 -0
  207. package/core/server/web/shared/{middlewares → middleware}/api/spam-prevention.js +0 -0
  208. package/core/server/web/shared/{middlewares → middleware}/brute.js +0 -0
  209. package/core/server/web/shared/{middlewares → middleware}/cache-control.js +0 -0
  210. package/core/server/web/shared/middleware/error-handler.js +224 -0
  211. package/core/server/web/shared/{middlewares → middleware}/index.js +0 -4
  212. package/core/server/web/shared/{middlewares → middleware}/pretty-urls.js +0 -0
  213. package/core/server/web/shared/{middlewares → middleware}/uncapitalise.js +0 -0
  214. package/core/server/web/shared/{middlewares → middleware}/url-redirects.js +0 -0
  215. package/core/shared/config/defaults.json +13 -1
  216. package/core/shared/config/helpers.js +42 -0
  217. package/core/shared/config/loader.js +1 -1
  218. package/core/shared/labs.js +9 -5
  219. package/core/shared/sentry.js +1 -1
  220. package/loggingrc.js +19 -20
  221. package/package.json +38 -37
  222. package/yarn.lock +1064 -892
  223. package/content/themes/casper/assets/js/gallery-card.js +0 -24
  224. package/core/built/assets/ghost-dark-39fb496d051565531062d7e047d1c0b1.css +0 -1
  225. package/core/built/assets/ghost.min-4207edfc1ae0a3f9f6505ca00d20b0c0.css +0 -1
  226. package/core/frontend/services/theme-engine/middleware.js +0 -209
  227. package/core/server/data/schema/fixtures/utils.js +0 -321
  228. package/core/server/web/parent/vhost-utils.js +0 -39
  229. package/core/server/web/shared/middlewares/error-handler.js +0 -329
  230. package/core/server/web/shared/middlewares/maintenance.js +0 -25
@@ -1,329 +0,0 @@
1
- const hbs = require('express-hbs');
2
- const _ = require('lodash');
3
- const debug = require('@tryghost/debug')('error-handler');
4
- const errors = require('@tryghost/errors');
5
- const tpl = require('@tryghost/tpl');
6
- const config = require('../../../../shared/config');
7
- const helpers = require('../../../../frontend/services/routing/helpers');
8
- const sentry = require('../../../../shared/sentry');
9
-
10
- const messages = {
11
- oopsErrorTemplateHasError: 'Oops, seems there is an error in the error template.',
12
- encounteredError: 'Encountered the error: ',
13
- whilstTryingToRender: 'whilst trying to render an error page for the error: ',
14
- pageNotFound: 'Page not found',
15
- resourceNotFound: 'Resource not found',
16
- actions: {
17
- images: {
18
- upload: 'upload image'
19
- }
20
- },
21
- userMessages: {
22
- BookshelfRelationsError: 'Database error, cannot {action}.',
23
- InternalServerError: 'Internal server error, cannot {action}.',
24
- IncorrectUsageError: 'Incorrect usage error, cannot {action}.',
25
- NotFoundError: 'Resource not found error, cannot {action}.',
26
- BadRequestError: 'Request not understood error, cannot {action}.',
27
- UnauthorizedError: 'Authorisation error, cannot {action}.',
28
- NoPermissionError: 'Permission error, cannot {action}.',
29
- ValidationError: 'Validation error, cannot {action}.',
30
- UnsupportedMediaTypeError: 'Unsupported media error, cannot {action}.',
31
- TooManyRequestsError: 'Too many requests error, cannot {action}.',
32
- MaintenanceError: 'Server down for maintenance, cannot {action}.',
33
- MethodNotAllowedError: 'Method not allowed, cannot {action}.',
34
- RequestEntityTooLargeError: 'Request too large, cannot {action}.',
35
- TokenRevocationError: 'Token is not available, cannot {action}.',
36
- VersionMismatchError: 'Version mismatch error, cannot {action}.',
37
- DataExportError: 'Error exporting content.',
38
- DataImportError: 'Duplicated entry, cannot save {action}.',
39
- DatabaseVersionError: 'Database version compatibility error, cannot {action}.',
40
- EmailError: 'Error sending email!',
41
- ThemeValidationError: 'Theme validation error, cannot {action}.',
42
- HostLimitError: 'Host Limit error, cannot {action}.',
43
- DisabledFeatureError: 'Theme validation error, the {{{helperName}}} helper is not available. Cannot {action}.',
44
- UpdateCollisionError: 'Saving failed! Someone else is editing this post.'
45
- }
46
- };
47
-
48
- const escapeExpression = hbs.Utils.escapeExpression;
49
- const _private = {};
50
- const errorHandler = {};
51
-
52
- /**
53
- * This is a bare minimum setup, which allows us to render the error page
54
- * It uses the {{asset}} helper, and nothing more
55
- */
56
- _private.createHbsEngine = () => {
57
- const engine = hbs.create();
58
- engine.registerHelper('asset', require('../../../../frontend/helpers/asset'));
59
-
60
- return engine.express4();
61
- };
62
-
63
- /**
64
- * Get an error ready to be shown the the user
65
- *
66
- * @TODO: support multiple errors within one single error, see https://github.com/TryGhost/Ghost/issues/7116#issuecomment-252231809
67
- */
68
- _private.prepareError = (err, req, res, next) => {
69
- debug(err);
70
-
71
- if (Array.isArray(err)) {
72
- err = err[0];
73
- }
74
-
75
- if (!errors.utils.isIgnitionError(err)) {
76
- // We need a special case for 404 errors
77
- // @TODO look at adding this to the GhostError class
78
- if (err.statusCode && err.statusCode === 404) {
79
- err = new errors.NotFoundError({
80
- err: err
81
- });
82
- } else if (err.stack.match(/node_modules\/handlebars\//)) {
83
- // Temporary handling of theme errors from handlebars
84
- // @TODO remove this when #10496 is solved properly
85
- err = new errors.IncorrectUsageError({
86
- err: err,
87
- message: err.message,
88
- statusCode: err.statusCode
89
- });
90
- } else {
91
- err = new errors.GhostError({
92
- err: err,
93
- message: err.message,
94
- statusCode: err.statusCode
95
- });
96
- }
97
- }
98
-
99
- // used for express logging middleware see core/server/app.js
100
- req.err = err;
101
-
102
- // alternative for res.status();
103
- res.statusCode = err.statusCode;
104
-
105
- // never cache errors
106
- res.set({
107
- 'Cache-Control': 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0'
108
- });
109
-
110
- next(err);
111
- };
112
-
113
- _private.JSONErrorRenderer = (err, req, res, next) => { // eslint-disable-line no-unused-vars
114
- res.json({
115
- errors: [{
116
- message: err.message,
117
- context: err.context,
118
- help: err.help,
119
- errorType: err.errorType,
120
- errorDetails: err.errorDetails,
121
- ghostErrorCode: err.ghostErrorCode
122
- }]
123
- });
124
- };
125
-
126
- _private.prepareUserMessage = (err, res) => {
127
- const userError = {
128
- message: err.message,
129
- context: err.context
130
- };
131
-
132
- const docName = _.get(res, 'frameOptions.docName');
133
- const method = _.get(res, 'frameOptions.method');
134
-
135
- if (docName && method) {
136
- let action;
137
-
138
- const actionMap = {
139
- browse: 'list',
140
- read: 'read',
141
- add: 'save',
142
- edit: 'edit',
143
- destroy: 'delete'
144
- };
145
-
146
- if (_.get(messages.actions, [docName, method])) {
147
- action = tpl(messages.actions[docName][method]);
148
- } else if (Object.keys(actionMap).includes(method)) {
149
- let resource = docName;
150
-
151
- if (method !== 'browse') {
152
- resource = resource.replace(/s$/, '');
153
- }
154
-
155
- action = `${actionMap[method]} ${resource}`;
156
- }
157
-
158
- if (action) {
159
- if (err.context) {
160
- userError.context = `${err.message} ${err.context}`;
161
- } else {
162
- userError.context = err.message;
163
- }
164
-
165
- userError.message = tpl(messages.userMessages[err.name], {action: action});
166
- }
167
- }
168
-
169
- return userError;
170
- };
171
-
172
- _private.JSONErrorRendererV2 = (err, req, res, next) => { // eslint-disable-line no-unused-vars
173
- const userError = _private.prepareUserMessage(err, req);
174
-
175
- res.json({
176
- errors: [{
177
- message: userError.message || null,
178
- context: userError.context || null,
179
- type: err.errorType || null,
180
- details: err.errorDetails || null,
181
- property: err.property || null,
182
- help: err.help || null,
183
- code: err.code || null,
184
- id: err.id || null
185
- }]
186
- });
187
- };
188
-
189
- _private.ErrorFallbackMessage = err => `<h1>${tpl(messages.oopsErrorTemplateHasError)}</h1>
190
- <p>${tpl(messages.encounteredError)}</p>
191
- <pre>${escapeExpression(err.message || err)}</pre>
192
- <br ><p>${tpl(messages.whilstTryingToRender)}</p>
193
- ${err.statusCode} <pre>${escapeExpression(err.message || err)}</pre>`;
194
-
195
- _private.ThemeErrorRenderer = (err, req, res, next) => {
196
- // If the error code is explicitly set to STATIC_FILE_NOT_FOUND,
197
- // Skip trying to render an HTML error, and move on to the basic error renderer
198
- // We do this because customised 404 templates could reference the image that's missing
199
- // A better long term solution might be to do this based on extension
200
- if (err.code === 'STATIC_FILE_NOT_FOUND') {
201
- return next(err);
202
- }
203
-
204
- // Renderer begin
205
- // Format Data
206
- const data = {
207
- message: err.message,
208
- // @deprecated Remove in Ghost 5.0
209
- code: err.statusCode,
210
- statusCode: err.statusCode,
211
- errorDetails: err.errorDetails || []
212
- };
213
-
214
- // Template
215
- // @TODO: very dirty !!!!!!
216
- helpers.templates.setTemplate(req, res);
217
-
218
- // It can be that something went wrong with the theme or otherwise loading handlebars
219
- // This ensures that no matter what res.render will work here
220
- // @TODO: split the error handler for assets, admin & theme to refactor this away
221
- if (_.isEmpty(req.app.engines)) {
222
- res._template = 'error';
223
- req.app.engine('hbs', _private.createHbsEngine());
224
- req.app.set('view engine', 'hbs');
225
- req.app.set('views', config.get('paths').defaultViews);
226
- }
227
-
228
- // @TODO use renderer here?!
229
- // Render Call - featuring an error handler for what happens if rendering fails
230
- res.render(res._template, data, (_err, html) => {
231
- if (!_err) {
232
- return res.send(html);
233
- }
234
-
235
- // re-attach new error e.g. error template has syntax error or misusage
236
- req.err = _err;
237
-
238
- // And then try to explain things to the user...
239
- // Cheat and output the error using handlebars escapeExpression
240
- return res.status(500).send(_private.ErrorFallbackMessage(_err));
241
- });
242
- };
243
-
244
- _private.HTMLErrorRenderer = (err, req, res, next) => { // eslint-disable-line no-unused-vars
245
- const data = {
246
- message: err.message,
247
- statusCode: err.statusCode,
248
- errorDetails: err.errorDetails || []
249
- };
250
-
251
- // e.g. if you serve the admin /ghost and Ghost returns a 503 because it generates the urls at the moment.
252
- // This ensures that no matter what res.render will work here
253
- // @TODO: put to prepare error function?
254
- if (_.isEmpty(req.app.engines)) {
255
- res._template = 'error';
256
- req.app.engine('hbs', _private.createHbsEngine());
257
- req.app.set('view engine', 'hbs');
258
- req.app.set('views', config.get('paths').defaultViews);
259
- }
260
-
261
- res.render('error', data, (_err, html) => {
262
- if (!_err) {
263
- return res.send(html);
264
- }
265
-
266
- // re-attach new error e.g. error template has syntax error or misusage
267
- req.err = _err;
268
-
269
- // And then try to explain things to the user...
270
- // Cheat and output the error using handlebars escapeExpression
271
- return res.status(500).send(_private.ErrorFallbackMessage(_err));
272
- });
273
- };
274
-
275
- _private.BasicErrorRenderer = (err, req, res, next) => { // eslint-disable-line no-unused-vars
276
- return res.send(res.statusCode + ' ' + err.message);
277
- };
278
-
279
- errorHandler.resourceNotFound = (req, res, next) => {
280
- // TODO, handle unknown resources & methods differently, so that we can also produce
281
- // 405 Method Not Allowed
282
- next(new errors.NotFoundError({message: tpl(messages.resourceNotFound)}));
283
- };
284
-
285
- errorHandler.pageNotFound = (req, res, next) => {
286
- next(new errors.NotFoundError({message: tpl(messages.pageNotFound)}));
287
- };
288
-
289
- errorHandler.handleJSONResponse = [
290
- // Make sure the error can be served
291
- _private.prepareError,
292
- // Handle the error in Sentry
293
- sentry.errorHandler,
294
- // Render the error using JSON format
295
- _private.JSONErrorRenderer
296
- ];
297
-
298
- errorHandler.handleJSONResponseV2 = [
299
- // Make sure the error can be served
300
- _private.prepareError,
301
- // Handle the error in Sentry
302
- sentry.errorHandler,
303
- // Render the error using JSON format
304
- _private.JSONErrorRendererV2
305
- ];
306
-
307
- errorHandler.handleHTMLResponse = [
308
- // Make sure the error can be served
309
- _private.prepareError,
310
- // Handle the error in Sentry
311
- sentry.errorHandler,
312
- // Render the error using HTML format
313
- _private.HTMLErrorRenderer,
314
- // Fall back to basic if HTML is not explicitly accepted
315
- _private.BasicErrorRenderer
316
- ];
317
-
318
- errorHandler.handleThemeResponse = [
319
- // Make sure the error can be served
320
- _private.prepareError,
321
- // Handle the error in Sentry
322
- sentry.errorHandler,
323
- // Render the error using theme template
324
- _private.ThemeErrorRenderer,
325
- // Fall back to basic if HTML is not explicitly accepted
326
- _private.BasicErrorRenderer
327
- ];
328
-
329
- module.exports = errorHandler;
@@ -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
- };