ghost 4.23.0 → 4.26.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 (175) 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 +50 -215
  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 +20 -5
  15. package/core/boot.js +77 -36
  16. package/core/bridge.js +10 -10
  17. package/core/built/assets/ghost-dark-ef86e3bc7f0fb83d39d3d6a49bff8dd5.css +1 -0
  18. package/core/built/assets/ghost.min-57c1e677f42d596942d317ce93e8a62c.css +1 -0
  19. package/core/built/assets/{ghost.min-cccc107e881b74c7aaf1a73e1e5e0dee.js → ghost.min-f3c6886e191d34450e9ffca0c8fa056e.js} +543 -618
  20. package/core/built/assets/icons/audio-upload.svg +8 -0
  21. package/core/built/assets/{vendor.min-c9002845b6c30ac978abdadde9f33d7c.js → vendor.min-b6b8d2a31d61830c2d8f65c5ba54236a.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 +75 -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/audio.css +186 -0
  37. package/core/frontend/src/cards/css/blockquote.css +27 -0
  38. package/core/frontend/src/cards/css/bookmark.css +7 -0
  39. package/core/frontend/src/cards/css/button.css +4 -0
  40. package/core/frontend/src/cards/css/callout.css +23 -15
  41. package/core/frontend/src/cards/css/gallery.css +13 -3
  42. package/core/frontend/src/cards/css/toggle.css +48 -15
  43. package/core/frontend/src/cards/js/audio.js +137 -0
  44. package/core/frontend/web/middleware/error-handler.js +93 -0
  45. package/core/frontend/web/middleware/handle-image-sizes.js +3 -6
  46. package/core/frontend/web/middleware/index.js +1 -0
  47. package/core/frontend/web/middleware/serve-public-file.js +25 -8
  48. package/core/frontend/web/site.js +2 -5
  49. package/core/server/adapters/scheduling/SchedulingDefault.js +2 -2
  50. package/core/server/adapters/storage/LocalStorageBase.js +2 -2
  51. package/core/server/api/canary/db.js +2 -2
  52. package/core/server/api/canary/media.js +3 -2
  53. package/core/server/api/canary/oembed.js +16 -1
  54. package/core/server/api/canary/session.js +1 -1
  55. package/core/server/api/canary/slugs.js +1 -1
  56. package/core/server/api/canary/utils/permissions.js +2 -2
  57. package/core/server/api/canary/utils/serializers/output/config.js +2 -6
  58. package/core/server/api/v2/db.js +2 -2
  59. package/core/server/api/v2/session.js +1 -1
  60. package/core/server/api/v2/slugs.js +1 -1
  61. package/core/server/api/v2/utils/permissions.js +2 -2
  62. package/core/server/api/v3/db.js +2 -2
  63. package/core/server/api/v3/session.js +1 -1
  64. package/core/server/api/v3/slugs.js +1 -1
  65. package/core/server/api/v3/utils/permissions.js +2 -2
  66. package/core/server/data/db/state-manager.js +4 -4
  67. package/core/server/data/exporter/export-filename.js +1 -1
  68. package/core/server/data/importer/handlers/json.js +1 -1
  69. package/core/server/data/importer/import-manager.js +1 -1
  70. package/core/server/data/importer/importers/data/base.js +1 -1
  71. package/core/server/data/migrations/utils.js +2 -2
  72. package/core/server/data/migrations/versions/1.25/1-update-koenig-beta-html.js +1 -0
  73. package/core/server/data/migrations/versions/3.1/08-add-uuid-values-to-members.js +1 -0
  74. package/core/server/data/migrations/versions/3.22/02-settings-key-renames.js +2 -0
  75. package/core/server/data/migrations/versions/3.22/05-migrate-members-subscription-settings.js +3 -0
  76. package/core/server/data/migrations/versions/3.22/06-migrate-stripe-connect-settings.js +2 -0
  77. package/core/server/data/migrations/versions/3.23/01-migrate-bulk-email-settings.js +1 -0
  78. package/core/server/data/migrations/versions/3.29/01-remove-duplicate-subscriptions.js +2 -0
  79. package/core/server/data/migrations/versions/3.29/02-remove-duplicate-customers.js +2 -0
  80. package/core/server/data/migrations/versions/3.38/04-populate-recipient-filter-column.js +2 -0
  81. package/core/server/data/migrations/versions/4.0/01-update-mobiledoc.js +2 -0
  82. package/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +4 -0
  83. package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +1 -0
  84. package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +1 -0
  85. package/core/server/data/migrations/versions/4.0/18-transform-urls-absolute-to-transform-ready.js +5 -0
  86. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +1 -0
  87. package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +1 -0
  88. package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +2 -1
  89. package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +1 -0
  90. package/core/server/data/migrations/versions/4.14/01-fix-comped-member-statuses.js +3 -0
  91. package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +1 -0
  92. package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +2 -0
  93. package/core/server/data/migrations/versions/4.23/01-truncate-offer-names.js +1 -0
  94. package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +1 -0
  95. package/core/server/data/migrations/versions/4.4/01-restore-free-members-signup-setting-from-backup.js +1 -0
  96. package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +1 -0
  97. package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +1 -0
  98. package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +1 -0
  99. package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +1 -0
  100. package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +1 -0
  101. package/core/server/data/schema/commands.js +2 -2
  102. package/core/server/ghost-server.js +2 -2
  103. package/core/server/lib/image/image-size.js +2 -2
  104. package/core/server/models/base/listeners.js +2 -2
  105. package/core/server/models/member-email-change-event.js +2 -2
  106. package/core/server/models/member-login-event.js +2 -2
  107. package/core/server/models/member-paid-subscription-event.js +3 -3
  108. package/core/server/models/member-payment-event.js +3 -3
  109. package/core/server/models/member-product-event.js +6 -6
  110. package/core/server/models/member-status-event.js +5 -3
  111. package/core/server/models/member-subscribe-event.js +9 -3
  112. package/core/server/models/relations/authors.js +1 -1
  113. package/core/server/models/settings.js +1 -1
  114. package/core/server/notify.js +1 -2
  115. package/core/server/services/auth/passwordreset.js +1 -1
  116. package/core/server/services/auth/setup.js +1 -1
  117. package/core/server/services/email-analytics/jobs/index.js +1 -1
  118. package/core/server/services/mega/mega.js +6 -4
  119. package/core/server/services/mega/template.js +47 -17
  120. package/core/server/services/members/api.js +22 -0
  121. package/core/server/services/members/config.js +1 -1
  122. package/core/server/services/members/emails/signup-paid.js +168 -0
  123. package/core/server/services/members/service.js +6 -2
  124. package/core/server/services/members/stripe-connect.js +4 -2
  125. package/core/server/services/nft-oembed.js +7 -2
  126. package/core/server/services/oembed.js +15 -3
  127. package/core/server/services/permissions/can-this.js +1 -1
  128. package/core/server/services/redirects/api.js +20 -25
  129. package/core/server/services/redirects/index.js +18 -10
  130. package/core/server/services/redirects/utils.js +14 -0
  131. package/core/server/services/redirects/validation.js +10 -0
  132. package/core/server/services/route-settings/default-settings-manager.js +1 -1
  133. package/core/server/services/route-settings/index.js +40 -17
  134. package/core/server/services/route-settings/route-settings.js +120 -115
  135. package/core/server/services/route-settings/settings-loader.js +18 -36
  136. package/core/server/services/route-settings/yaml-parser.js +1 -1
  137. package/core/server/services/slack.js +1 -1
  138. package/core/server/services/themes/activation-bridge.js +3 -3
  139. package/core/server/services/themes/storage.js +2 -2
  140. package/core/server/services/twitter-embed.js +81 -0
  141. package/core/server/services/url/LocalFileCache.js +75 -0
  142. package/core/server/services/url/UrlService.js +15 -47
  143. package/core/server/services/url/index.js +17 -4
  144. package/core/server/services/xmlrpc.js +2 -2
  145. package/core/server/web/admin/app.js +2 -5
  146. package/core/server/web/admin/controller.js +35 -12
  147. package/core/server/web/admin/middleware/redirect-admin-urls.js +15 -0
  148. package/core/server/web/admin/views/default-prod.html +4 -4
  149. package/core/server/web/admin/views/default.html +4 -4
  150. package/core/server/web/api/canary/admin/app.js +0 -3
  151. package/core/server/web/api/canary/admin/middleware.js +1 -1
  152. package/core/server/web/api/canary/content/app.js +0 -3
  153. package/core/server/web/api/v2/admin/app.js +0 -3
  154. package/core/server/web/api/v2/admin/middleware.js +1 -1
  155. package/core/server/web/api/v2/content/app.js +0 -3
  156. package/core/server/web/api/v3/admin/app.js +0 -3
  157. package/core/server/web/api/v3/admin/middleware.js +1 -1
  158. package/core/server/web/api/v3/content/app.js +0 -3
  159. package/core/server/web/members/app.js +0 -3
  160. package/core/server/web/oauth/app.js +0 -4
  161. package/core/server/web/parent/app.js +2 -13
  162. package/core/server/web/parent/backend.js +2 -0
  163. package/core/server/web/shared/middleware/error-handler.js +57 -162
  164. package/core/server/web/shared/middleware/index.js +0 -4
  165. package/core/shared/config/defaults.json +7 -1
  166. package/core/shared/express.js +1 -1
  167. package/core/shared/labs.js +12 -7
  168. package/core/shared/sentry.js +1 -1
  169. package/package.json +41 -40
  170. package/yarn.lock +799 -948
  171. package/content/themes/casper/assets/js/gallery-card.js +0 -24
  172. package/core/built/assets/ghost-dark-42cf6e0c730578940ec069bda45aea41.css +0 -1
  173. package/core/built/assets/ghost.min-fcf6a0738421f86c47c55f20d00c5ba9.css +0 -1
  174. package/core/frontend/services/theme-engine/middleware.js +0 -209
  175. package/core/server/web/shared/middleware/maintenance.js +0 -25
package/core/boot.js CHANGED
@@ -69,8 +69,9 @@ async function initDatabase({config, logging}) {
69
69
  * @param {object} options.ghostServer
70
70
  * @param {object} options.config
71
71
  * @param {object} options.bootLogger
72
+ * @param {boolean} options.frontend
72
73
  */
73
- async function initCore({ghostServer, config, bootLogger}) {
74
+ async function initCore({ghostServer, config, bootLogger, frontend}) {
74
75
  debug('Begin: initCore');
75
76
 
76
77
  // URL Utils is a bit slow, put it here so the timing is visible separate from models
@@ -95,25 +96,29 @@ async function initCore({ghostServer, config, bootLogger}) {
95
96
  debug('Begin: Url Service');
96
97
  const urlService = require('./server/services/url');
97
98
  // Note: there is no await here, we do not wait for the url service to finish
98
- // We can return, but the site will remain in (the shared, not global) maintenance mode until this finishes
99
- // This is managed on request: https://github.com/TryGhost/Ghost/blob/main/core/server/web/shared/middleware/maintenance.js#L13
99
+ // We can return, but the site will remain in maintenance mode until this finishes
100
+ // This is managed on request: https://github.com/TryGhost/Ghost/blob/main/core/app.js#L10
100
101
  urlService.init({
101
102
  onFinished: () => {
102
103
  bootLogger.log('URL Service Ready');
103
- }
104
+ },
105
+ urlCache: !frontend // hacky parameter to make the cache initialization kick in as we can't initialize labs before the boot
104
106
  });
105
107
  debug('End: Url Service');
106
108
 
107
- // Job Service allows parts of Ghost to run in the background
108
- debug('Begin: Job Service');
109
- const jobService = require('./server/services/jobs');
110
- ghostServer.registerCleanupTask(async () => {
111
- await jobService.shutdown();
112
- });
113
- ghostServer.registerCleanupTask(async () => {
114
- await urlService.shutdown();
115
- });
116
- debug('End: Job Service');
109
+ if (ghostServer) {
110
+ // Job Service allows parts of Ghost to run in the background
111
+ debug('Begin: Job Service');
112
+ const jobService = require('./server/services/jobs');
113
+ ghostServer.registerCleanupTask(async () => {
114
+ await jobService.shutdown();
115
+ });
116
+ debug('End: Job Service');
117
+
118
+ ghostServer.registerCleanupTask(async () => {
119
+ await urlService.shutdown();
120
+ });
121
+ }
117
122
 
118
123
  debug('End: initCore');
119
124
  }
@@ -129,6 +134,11 @@ async function initServicesForFrontend() {
129
134
  await routeSettings.init();
130
135
  debug('End: Routing Settings');
131
136
 
137
+ debug('Begin: Redirects');
138
+ const customRedirects = require('./server/services/redirects');
139
+ await customRedirects.init(),
140
+ debug('End: Redirects');
141
+
132
142
  debug('Begin: Themes');
133
143
  // customThemSettingsService.api must be initialized before any theme activation occurs
134
144
  const customThemeSettingsService = require('./server/services/custom-theme-settings');
@@ -149,9 +159,6 @@ async function initFrontend() {
149
159
  const helperService = require('./frontend/services/helpers');
150
160
  await helperService.init();
151
161
 
152
- const cardAssetService = require('./frontend/services/card-assets');
153
- await cardAssetService.init();
154
-
155
162
  debug('End: initFrontend');
156
163
  }
157
164
 
@@ -159,10 +166,30 @@ async function initFrontend() {
159
166
  * At the moment we load our express apps all in one go, they require themselves and are co-located
160
167
  * What we want is to be able to optionally load various components and mount them
161
168
  * So eventually this function should go away
169
+ * @param {Object} options
170
+ * @param {Boolean} options.backend
171
+ * @param {Boolean} options.frontend
172
+ * @param {Object} options.config
162
173
  */
163
- async function initExpressApps() {
174
+ async function initExpressApps({frontend, backend, config}) {
164
175
  debug('Begin: initExpressApps');
176
+
165
177
  const parentApp = require('./server/web/parent/app')();
178
+ const vhost = require('@tryghost/vhost-middleware');
179
+
180
+ // Mount the express apps on the parentApp
181
+ if (backend) {
182
+ // ADMIN + API
183
+ const backendApp = require('./server/web/parent/backend')();
184
+ parentApp.use(vhost(config.getBackendMountPath(), backendApp));
185
+ }
186
+
187
+ if (frontend) {
188
+ // SITE + MEMBERS
189
+ const frontendApp = require('./server/web/parent/frontend')({});
190
+ parentApp.use(vhost(config.getFrontendMountPath(), frontendApp));
191
+ }
192
+
166
193
  debug('End: initExpressApps');
167
194
  return parentApp;
168
195
  }
@@ -178,6 +205,7 @@ async function initDynamicRouting() {
178
205
  const routing = require('./frontend/services/routing');
179
206
  const routeSettingsService = require('./server/services/route-settings');
180
207
  const bridge = require('./bridge');
208
+ bridge.init();
181
209
 
182
210
  // We pass the frontend API version + the dynamic routes here, so that the frontend services are slightly less tightly-coupled
183
211
  const apiVersion = bridge.getFrontendApiVersion();
@@ -219,7 +247,6 @@ async function initServices({config}) {
219
247
  const appService = require('./frontend/services/apps');
220
248
  const limits = require('./server/services/limits');
221
249
  const scheduling = require('./server/adapters/scheduling');
222
- const customRedirects = require('./server/services/redirects');
223
250
 
224
251
  const urlUtils = require('./shared/url-utils');
225
252
 
@@ -233,7 +260,6 @@ async function initServices({config}) {
233
260
  await offers.init();
234
261
 
235
262
  await Promise.all([
236
- customRedirects.init(),
237
263
  members.init(),
238
264
  permissions.init(),
239
265
  xmlrpc.listen(),
@@ -271,7 +297,7 @@ async function initBackgroundServices({config}) {
271
297
  themeService.loadInactiveThemes();
272
298
 
273
299
  // we don't want to kick off background services that will interfere with tests
274
- if (process.env.NODE_ENV.match(/^testing/)) {
300
+ if (process.env.NODE_ENV.startsWith('test')) {
275
301
  return;
276
302
  }
277
303
 
@@ -297,7 +323,7 @@ async function initBackgroundServices({config}) {
297
323
 
298
324
  * @returns {Promise<object>} ghostServer
299
325
  */
300
- async function bootGhost() {
326
+ async function bootGhost({backend = true, frontend = true, server = true} = {}) {
301
327
  // Metrics
302
328
  const startTime = Date.now();
303
329
  debug('Begin Boot');
@@ -345,12 +371,15 @@ async function bootGhost() {
345
371
 
346
372
  // Step 2 - Start server with minimal app in global maintenance mode
347
373
  debug('Begin: load server + minimal app');
348
- const rootApp = require('./app');
349
- const GhostServer = require('./server/ghost-server');
350
- ghostServer = new GhostServer({url: config.getSiteUrl()});
351
- await ghostServer.start(rootApp);
352
- bootLogger.log('server started');
353
- debug('End: load server + minimal app');
374
+ const rootApp = require('./app')();
375
+
376
+ if (server) {
377
+ const GhostServer = require('./server/ghost-server');
378
+ ghostServer = new GhostServer({url: config.getSiteUrl()});
379
+ await ghostServer.start(rootApp);
380
+ bootLogger.log('server started');
381
+ debug('End: load server + minimal app');
382
+ }
354
383
 
355
384
  // Step 3 - Get the DB ready
356
385
  debug('Begin: Get DB ready');
@@ -360,11 +389,18 @@ async function bootGhost() {
360
389
 
361
390
  // Step 4 - Load Ghost with all its services
362
391
  debug('Begin: Load Ghost Services & Apps');
363
- await initCore({ghostServer, config, bootLogger});
392
+ await initCore({ghostServer, config, bootLogger, frontend});
364
393
  await initServicesForFrontend();
365
- await initFrontend();
366
- const ghostApp = await initExpressApps();
367
- await initDynamicRouting();
394
+
395
+ if (frontend) {
396
+ await initFrontend();
397
+ }
398
+ const ghostApp = await initExpressApps({frontend, backend, config});
399
+
400
+ if (frontend) {
401
+ await initDynamicRouting();
402
+ }
403
+
368
404
  await initServices({config});
369
405
  debug('End: Load Ghost Services & Apps');
370
406
 
@@ -383,15 +419,20 @@ async function bootGhost() {
383
419
  initBackgroundServices({config});
384
420
 
385
421
  // We return the server purely for testing purposes
386
- debug('End Boot: Returning Ghost Server');
387
- return ghostServer;
422
+ if (server) {
423
+ debug('End Boot: Returning Ghost Server');
424
+ return ghostServer;
425
+ } else {
426
+ debug('End boot: Returning Root App');
427
+ return rootApp;
428
+ }
388
429
  } catch (error) {
389
430
  const errors = require('@tryghost/errors');
390
431
 
391
432
  // Ensure the error we have is an ignition error
392
433
  let serverStartError = error;
393
- if (!errors.utils.isIgnitionError(serverStartError)) {
394
- serverStartError = new errors.GhostError({message: serverStartError.message, err: serverStartError});
434
+ if (!errors.utils.isGhostError(serverStartError)) {
435
+ serverStartError = new errors.InternalServerError({message: serverStartError.message, err: serverStartError});
395
436
  }
396
437
 
397
438
  logging.error(serverStartError);
package/core/bridge.js CHANGED
@@ -16,6 +16,7 @@ const config = require('./shared/config');
16
16
  const logging = require('@tryghost/logging');
17
17
  const tpl = require('@tryghost/tpl');
18
18
  const themeEngine = require('./frontend/services/theme-engine');
19
+ const cardAssetService = require('./frontend/services/card-assets');
19
20
  const routerManager = require('./frontend/services/routing').routerManager;
20
21
  const settingsCache = require('./shared/settings-cache');
21
22
 
@@ -27,7 +28,7 @@ const messages = {
27
28
  };
28
29
 
29
30
  class Bridge {
30
- constructor() {
31
+ init() {
31
32
  /**
32
33
  * When locale changes, we reload theme translations
33
34
  * @deprecated: the term "lang" was deprecated in favor of "locale" publicly in 4.0
@@ -49,7 +50,7 @@ class Bridge {
49
50
  return themeEngine.getActive();
50
51
  }
51
52
 
52
- activateTheme(loadedTheme, checkedTheme) {
53
+ async activateTheme(loadedTheme, checkedTheme) {
53
54
  let settings = {
54
55
  locale: settingsCache.get('lang')
55
56
  };
@@ -67,8 +68,12 @@ class Bridge {
67
68
 
68
69
  if (previousGhostAPI !== undefined && (previousGhostAPI !== currentGhostAPI)) {
69
70
  events.emit('services.themes.api.changed');
70
- this.reloadFrontend();
71
+ await this.reloadFrontend();
71
72
  }
73
+
74
+ const cardAssetConfig = this.getCardAssetConfig();
75
+ debug('reload card assets config', cardAssetConfig);
76
+ await cardAssetService.load(cardAssetConfig);
72
77
  } catch (err) {
73
78
  logging.error(new errors.InternalServerError({
74
79
  message: tpl(messages.activateFailed, {theme: loadedTheme.name}),
@@ -93,17 +98,12 @@ class Bridge {
93
98
  }
94
99
  }
95
100
 
96
- reloadFrontend() {
101
+ async reloadFrontend() {
97
102
  const apiVersion = this.getFrontendApiVersion();
98
- const cardAssetConfig = this.getCardAssetConfig();
99
-
100
- debug('reload card assets config', cardAssetConfig);
101
- const cardAssetService = require('./frontend/services/card-assets');
102
- cardAssetService.load(cardAssetConfig);
103
103
 
104
104
  debug('reload frontend', apiVersion);
105
105
  const siteApp = require('./frontend/web/site');
106
- siteApp.reload({apiVersion});
106
+ await siteApp.reload({apiVersion});
107
107
  }
108
108
  }
109
109