ghost 5.48.1 → 5.49.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 (165) hide show
  1. package/components/tryghost-adapter-cache-memory-ttl-5.49.1.tgz +0 -0
  2. package/components/tryghost-adapter-cache-redis-5.49.1.tgz +0 -0
  3. package/components/tryghost-adapter-manager-5.49.1.tgz +0 -0
  4. package/components/tryghost-announcement-bar-settings-5.49.1.tgz +0 -0
  5. package/components/{tryghost-api-framework-5.48.1.tgz → tryghost-api-framework-5.49.1.tgz} +0 -0
  6. package/components/tryghost-api-version-compatibility-service-5.49.1.tgz +0 -0
  7. package/components/tryghost-audience-feedback-5.49.1.tgz +0 -0
  8. package/components/tryghost-bootstrap-socket-5.49.1.tgz +0 -0
  9. package/components/tryghost-collections-5.49.1.tgz +0 -0
  10. package/components/tryghost-constants-5.49.1.tgz +0 -0
  11. package/components/tryghost-custom-theme-settings-service-5.49.1.tgz +0 -0
  12. package/components/{tryghost-data-generator-5.48.1.tgz → tryghost-data-generator-5.49.1.tgz} +0 -0
  13. package/components/tryghost-domain-events-5.49.1.tgz +0 -0
  14. package/components/tryghost-dynamic-routing-events-5.49.1.tgz +0 -0
  15. package/components/tryghost-email-analytics-provider-mailgun-5.49.1.tgz +0 -0
  16. package/components/tryghost-email-analytics-service-5.49.1.tgz +0 -0
  17. package/components/tryghost-email-content-generator-5.49.1.tgz +0 -0
  18. package/components/tryghost-email-events-5.49.1.tgz +0 -0
  19. package/components/tryghost-email-service-5.49.1.tgz +0 -0
  20. package/components/tryghost-email-suppression-list-5.49.1.tgz +0 -0
  21. package/components/tryghost-event-aware-cache-wrapper-5.49.1.tgz +0 -0
  22. package/components/tryghost-express-dynamic-redirects-5.49.1.tgz +0 -0
  23. package/components/tryghost-external-media-inliner-5.49.1.tgz +0 -0
  24. package/components/tryghost-extract-api-key-5.49.1.tgz +0 -0
  25. package/components/tryghost-html-to-plaintext-5.49.1.tgz +0 -0
  26. package/components/tryghost-i18n-5.49.1.tgz +0 -0
  27. package/components/tryghost-importer-handler-content-files-5.49.1.tgz +0 -0
  28. package/components/tryghost-importer-revue-5.49.1.tgz +0 -0
  29. package/components/tryghost-in-memory-repository-5.49.1.tgz +0 -0
  30. package/components/tryghost-job-manager-5.49.1.tgz +0 -0
  31. package/components/tryghost-link-redirects-5.49.1.tgz +0 -0
  32. package/components/tryghost-link-replacer-5.49.1.tgz +0 -0
  33. package/components/tryghost-link-tracking-5.49.1.tgz +0 -0
  34. package/components/{tryghost-magic-link-5.48.1.tgz → tryghost-magic-link-5.49.1.tgz} +0 -0
  35. package/components/tryghost-mailgun-client-5.49.1.tgz +0 -0
  36. package/components/tryghost-member-attribution-5.49.1.tgz +0 -0
  37. package/components/tryghost-member-events-5.49.1.tgz +0 -0
  38. package/components/{tryghost-members-api-5.48.1.tgz → tryghost-members-api-5.49.1.tgz} +0 -0
  39. package/components/tryghost-members-csv-5.49.1.tgz +0 -0
  40. package/components/tryghost-members-events-service-5.49.1.tgz +0 -0
  41. package/components/{tryghost-members-importer-5.48.1.tgz → tryghost-members-importer-5.49.1.tgz} +0 -0
  42. package/components/tryghost-members-offers-5.49.1.tgz +0 -0
  43. package/components/tryghost-members-payments-5.49.1.tgz +0 -0
  44. package/components/tryghost-members-ssr-5.49.1.tgz +0 -0
  45. package/components/{tryghost-members-stripe-service-5.48.1.tgz → tryghost-members-stripe-service-5.49.1.tgz} +0 -0
  46. package/components/tryghost-mentions-email-report-5.49.1.tgz +0 -0
  47. package/components/tryghost-milestones-5.49.1.tgz +0 -0
  48. package/components/tryghost-minifier-5.49.1.tgz +0 -0
  49. package/components/tryghost-mw-api-version-mismatch-5.49.1.tgz +0 -0
  50. package/components/tryghost-mw-cache-control-5.49.1.tgz +0 -0
  51. package/components/{tryghost-mw-error-handler-5.48.1.tgz → tryghost-mw-error-handler-5.49.1.tgz} +0 -0
  52. package/components/tryghost-mw-session-from-token-5.49.1.tgz +0 -0
  53. package/components/tryghost-mw-update-user-last-seen-5.49.1.tgz +0 -0
  54. package/components/tryghost-mw-version-match-5.49.1.tgz +0 -0
  55. package/components/tryghost-mw-vhost-5.49.1.tgz +0 -0
  56. package/components/tryghost-oembed-service-5.49.1.tgz +0 -0
  57. package/components/tryghost-package-json-5.49.1.tgz +0 -0
  58. package/components/tryghost-post-revisions-5.49.1.tgz +0 -0
  59. package/components/tryghost-posts-service-5.49.1.tgz +0 -0
  60. package/components/tryghost-referrers-5.49.1.tgz +0 -0
  61. package/components/tryghost-security-5.49.1.tgz +0 -0
  62. package/components/tryghost-session-service-5.49.1.tgz +0 -0
  63. package/components/tryghost-settings-path-manager-5.49.1.tgz +0 -0
  64. package/components/tryghost-slack-notifications-5.49.1.tgz +0 -0
  65. package/components/{tryghost-staff-service-5.48.1.tgz → tryghost-staff-service-5.49.1.tgz} +0 -0
  66. package/components/tryghost-stats-service-5.49.1.tgz +0 -0
  67. package/components/{tryghost-tiers-5.48.1.tgz → tryghost-tiers-5.49.1.tgz} +0 -0
  68. package/components/tryghost-update-check-service-5.49.1.tgz +0 -0
  69. package/components/tryghost-verification-trigger-5.49.1.tgz +0 -0
  70. package/components/tryghost-version-notifications-data-service-5.49.1.tgz +0 -0
  71. package/components/tryghost-webmentions-5.49.1.tgz +0 -0
  72. package/core/built/admin/assets/{chunk.362.6bb7cbc3fd3afda65ae1.js → chunk.124.ede028f827ba942bf7e3.js} +822 -688
  73. package/core/built/admin/assets/{chunk.143.7ffa4fa3e2ad37094023.js → chunk.143.c6e8ef2a5f6e62446120.js} +5 -5
  74. package/core/built/admin/assets/{chunk.178.b0604abd844e7e089a22.js → chunk.178.fa0781a33de6cfc8d401.js} +4 -4
  75. package/core/built/admin/assets/{ghost-f902f5e70d4a27fb3c35f775e50e65ff.js → ghost-9169ef48d0474b34a0a2a01edd29683b.js} +3753 -3651
  76. package/core/built/admin/assets/ghost-dark-b4374a49465902d3cd1a297ed3f5222f.css +1 -0
  77. package/core/built/admin/assets/ghost-e5dfcf346304a62879b8aa8380b500c7.css +1 -0
  78. package/core/built/admin/assets/{vendor-171b41e446763449417a8687279d2270.js → vendor-e0851d527586cb85e37e146ec921136a.js} +97 -88
  79. package/core/built/admin/index.html +6 -6
  80. package/core/frontend/src/cards/css/signup.css +316 -0
  81. package/core/server/api/endpoints/collections.js +115 -0
  82. package/core/server/api/endpoints/index.js +4 -0
  83. package/core/server/api/endpoints/utils/serializers/output/config.js +2 -1
  84. package/core/server/api/endpoints/utils/serializers/output/mappers/collections.js +38 -0
  85. package/core/server/api/endpoints/utils/serializers/output/mappers/index.js +1 -0
  86. package/core/server/run-update-check.js +7 -2
  87. package/core/server/services/collections/index.js +22 -0
  88. package/core/server/services/members/content-gating.js +1 -1
  89. package/core/server/services/members/emails/signin.js +5 -5
  90. package/core/server/services/members/emails/signup-paid.js +9 -9
  91. package/core/server/services/members/emails/signup.js +10 -10
  92. package/core/server/services/members/emails/subscribe.js +10 -10
  93. package/core/server/services/members/emails/update-email.js +8 -8
  94. package/core/server/services/public-config/config.js +2 -1
  95. package/core/server/update-check.js +15 -7
  96. package/core/server/web/api/endpoints/admin/routes.js +7 -0
  97. package/core/shared/config/defaults.json +4 -0
  98. package/core/shared/labs.js +2 -2
  99. package/package.json +142 -140
  100. package/yarn.lock +664 -1025
  101. package/components/tryghost-adapter-cache-memory-ttl-5.48.1.tgz +0 -0
  102. package/components/tryghost-adapter-cache-redis-5.48.1.tgz +0 -0
  103. package/components/tryghost-adapter-manager-5.48.1.tgz +0 -0
  104. package/components/tryghost-announcement-bar-settings-5.48.1.tgz +0 -0
  105. package/components/tryghost-api-version-compatibility-service-5.48.1.tgz +0 -0
  106. package/components/tryghost-audience-feedback-5.48.1.tgz +0 -0
  107. package/components/tryghost-bootstrap-socket-5.48.1.tgz +0 -0
  108. package/components/tryghost-collections-5.48.1.tgz +0 -0
  109. package/components/tryghost-constants-5.48.1.tgz +0 -0
  110. package/components/tryghost-custom-theme-settings-service-5.48.1.tgz +0 -0
  111. package/components/tryghost-domain-events-5.48.1.tgz +0 -0
  112. package/components/tryghost-dynamic-routing-events-5.48.1.tgz +0 -0
  113. package/components/tryghost-email-analytics-provider-mailgun-5.48.1.tgz +0 -0
  114. package/components/tryghost-email-analytics-service-5.48.1.tgz +0 -0
  115. package/components/tryghost-email-content-generator-5.48.1.tgz +0 -0
  116. package/components/tryghost-email-events-5.48.1.tgz +0 -0
  117. package/components/tryghost-email-service-5.48.1.tgz +0 -0
  118. package/components/tryghost-email-suppression-list-5.48.1.tgz +0 -0
  119. package/components/tryghost-event-aware-cache-wrapper-5.48.1.tgz +0 -0
  120. package/components/tryghost-express-dynamic-redirects-5.48.1.tgz +0 -0
  121. package/components/tryghost-external-media-inliner-5.48.1.tgz +0 -0
  122. package/components/tryghost-extract-api-key-5.48.1.tgz +0 -0
  123. package/components/tryghost-html-to-plaintext-5.48.1.tgz +0 -0
  124. package/components/tryghost-i18n-5.48.1.tgz +0 -0
  125. package/components/tryghost-importer-handler-content-files-5.48.1.tgz +0 -0
  126. package/components/tryghost-importer-revue-5.48.1.tgz +0 -0
  127. package/components/tryghost-in-memory-repository-5.48.1.tgz +0 -0
  128. package/components/tryghost-job-manager-5.48.1.tgz +0 -0
  129. package/components/tryghost-link-redirects-5.48.1.tgz +0 -0
  130. package/components/tryghost-link-replacer-5.48.1.tgz +0 -0
  131. package/components/tryghost-link-tracking-5.48.1.tgz +0 -0
  132. package/components/tryghost-mailgun-client-5.48.1.tgz +0 -0
  133. package/components/tryghost-member-attribution-5.48.1.tgz +0 -0
  134. package/components/tryghost-member-events-5.48.1.tgz +0 -0
  135. package/components/tryghost-members-csv-5.48.1.tgz +0 -0
  136. package/components/tryghost-members-events-service-5.48.1.tgz +0 -0
  137. package/components/tryghost-members-offers-5.48.1.tgz +0 -0
  138. package/components/tryghost-members-payments-5.48.1.tgz +0 -0
  139. package/components/tryghost-members-ssr-5.48.1.tgz +0 -0
  140. package/components/tryghost-mentions-email-report-5.48.1.tgz +0 -0
  141. package/components/tryghost-milestones-5.48.1.tgz +0 -0
  142. package/components/tryghost-minifier-5.48.1.tgz +0 -0
  143. package/components/tryghost-mw-api-version-mismatch-5.48.1.tgz +0 -0
  144. package/components/tryghost-mw-cache-control-5.48.1.tgz +0 -0
  145. package/components/tryghost-mw-session-from-token-5.48.1.tgz +0 -0
  146. package/components/tryghost-mw-update-user-last-seen-5.48.1.tgz +0 -0
  147. package/components/tryghost-mw-version-match-5.48.1.tgz +0 -0
  148. package/components/tryghost-mw-vhost-5.48.1.tgz +0 -0
  149. package/components/tryghost-oembed-service-5.48.1.tgz +0 -0
  150. package/components/tryghost-package-json-5.48.1.tgz +0 -0
  151. package/components/tryghost-post-revisions-5.48.1.tgz +0 -0
  152. package/components/tryghost-posts-service-5.48.1.tgz +0 -0
  153. package/components/tryghost-referrers-5.48.1.tgz +0 -0
  154. package/components/tryghost-security-5.48.1.tgz +0 -0
  155. package/components/tryghost-session-service-5.48.1.tgz +0 -0
  156. package/components/tryghost-settings-path-manager-5.48.1.tgz +0 -0
  157. package/components/tryghost-slack-notifications-5.48.1.tgz +0 -0
  158. package/components/tryghost-stats-service-5.48.1.tgz +0 -0
  159. package/components/tryghost-update-check-service-5.48.1.tgz +0 -0
  160. package/components/tryghost-verification-trigger-5.48.1.tgz +0 -0
  161. package/components/tryghost-version-notifications-data-service-5.48.1.tgz +0 -0
  162. package/components/tryghost-webmentions-5.48.1.tgz +0 -0
  163. package/core/built/admin/assets/ghost-4f32549fd7f27543889f729a10be18b4.css +0 -1
  164. package/core/built/admin/assets/ghost-dark-99e343e4c1fcf9b6c1bde9dea2b50c6f.css +0 -1
  165. /package/core/built/admin/assets/{chunk.362.6bb7cbc3fd3afda65ae1.js.LICENSE.txt → chunk.124.ede028f827ba942bf7e3.js.LICENSE.txt} +0 -0
@@ -8,7 +8,7 @@
8
8
  <title>Ghost Admin</title>
9
9
 
10
10
 
11
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%225.48%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22ember-websockets%22%3A%7B%22socketIO%22%3Atrue%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%7D" />
11
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%225.49%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22ember-websockets%22%3A%7B%22socketIO%22%3Atrue%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%7D" />
12
12
 
13
13
  <meta name="HandheldFriendly" content="True" />
14
14
  <meta name="MobileOptimized" content="320" />
@@ -37,7 +37,7 @@
37
37
  </style>
38
38
 
39
39
  <link integrity="" rel="stylesheet" href="assets/vendor-3e6947aa681f0fb82b193090e520dc73.css">
40
- <link integrity="" rel="stylesheet" href="assets/ghost-4f32549fd7f27543889f729a10be18b4.css" title="light">
40
+ <link integrity="" rel="stylesheet" href="assets/ghost-e5dfcf346304a62879b8aa8380b500c7.css" title="light">
41
41
 
42
42
 
43
43
  </head>
@@ -56,9 +56,9 @@
56
56
 
57
57
  <div id="ember-basic-dropdown-wormhole"></div>
58
58
 
59
- <script src="assets/vendor-171b41e446763449417a8687279d2270.js"></script>
60
- <script src="assets/chunk.362.6bb7cbc3fd3afda65ae1.js"></script>
61
- <script src="assets/chunk.143.7ffa4fa3e2ad37094023.js"></script>
62
- <script src="assets/ghost-f902f5e70d4a27fb3c35f775e50e65ff.js"></script>
59
+ <script src="assets/vendor-e0851d527586cb85e37e146ec921136a.js"></script>
60
+ <script src="assets/chunk.124.ede028f827ba942bf7e3.js"></script>
61
+ <script src="assets/chunk.143.c6e8ef2a5f6e62446120.js"></script>
62
+ <script src="assets/ghost-9169ef48d0474b34a0a2a01edd29683b.js"></script>
63
63
  </body>
64
64
  </html>
@@ -0,0 +1,316 @@
1
+ .kg-signup-card,
2
+ .kg-signup-card * {
3
+ box-sizing: border-box;
4
+ }
5
+
6
+ .kg-signup-card a,
7
+ .kg-signup-card a span {
8
+ color: currentColor;
9
+ }
10
+
11
+ .kg-signup-card.kg-layout-split {
12
+ display: grid;
13
+ grid-template-columns: 1fr 1fr;
14
+ }
15
+
16
+ .kg-signup-card-container {
17
+ position: relative;
18
+ display: flex;
19
+ flex-direction: column;
20
+ align-items: flex-start;
21
+ justify-content: center;
22
+ height: 100%;
23
+ padding: 4vmax;
24
+ background-size: cover;
25
+ background-position: center;
26
+ text-align: left;
27
+ }
28
+
29
+ .kg-width-wide .kg-signup-card-container {
30
+ padding: 6.4vmax;
31
+ }
32
+
33
+ .kg-width-full .kg-signup-card-container {
34
+ padding: 9.6vmax 7.2vmax;
35
+ }
36
+
37
+ .kg-layout-split .kg-signup-card-container {
38
+ padding: 9.6vmax 4vmax;
39
+ }
40
+
41
+ .kg-signup-card-container.align-center {
42
+ align-items: center;
43
+ text-align: center;
44
+ }
45
+
46
+ .kg-signup-card-container.kg-style-accent {
47
+ background-color: var(--ghost-accent-color);
48
+ }
49
+
50
+ .kg-signup-card.kg-swapped .kg-signup-card-container {
51
+ grid-row: 1;
52
+ }
53
+
54
+ .kg-signup-card.kg-style-image h2.kg-signup-card-heading,
55
+ .kg-signup-card.kg-style-image h3.kg-signup-card-subheading,
56
+ .kg-signup-card.kg-style-image .kg-signup-card-button {
57
+ z-index: 999;
58
+ }
59
+
60
+
61
+ /* Split layout image */
62
+
63
+ .kg-signup-card-image {
64
+ object-fit: cover;
65
+ object-position: center;
66
+ /* this will force the image to follow the signup card height */
67
+ height: 0;
68
+ min-height: 100%;
69
+ /**/
70
+ }
71
+
72
+ .kg-signup-card-image.kg-style-accent {
73
+ background-color: var(--ghost-accent-color);
74
+ }
75
+
76
+ /* Heading */
77
+
78
+ .kg-signup-card h2.kg-signup-card-heading {
79
+ font-size: 4.8vmin;
80
+ font-weight: 700;
81
+ line-height: 1em;
82
+ letter-spacing: -0.01em;
83
+ margin: 0;
84
+ }
85
+
86
+ .kg-signup-card h2.kg-signup-card-heading strong {
87
+ font-weight: 800;
88
+ }
89
+
90
+ .kg-signup-card.kg-width-wide h2.kg-signup-card-heading {
91
+ font-size: 6vmin;
92
+ }
93
+
94
+ .kg-signup-card.kg-width-full h2.kg-signup-card-heading {
95
+ font-size: 8vmin;
96
+ }
97
+
98
+ .kg-signup-card.kg-width-full.kg-layout-split h2.kg-signup-card-heading {
99
+ font-size: 6.4vmin;
100
+ }
101
+
102
+ /* Subheading */
103
+
104
+ .kg-signup-card-subheading {
105
+ margin: 0 0 2em;
106
+ }
107
+
108
+ .kg-signup-card h3.kg-signup-card-subheading {
109
+ font-size: 1.25em;
110
+ font-weight: 500;
111
+ line-height: 1.4em;
112
+ margin: 0;
113
+ max-width: 40em;
114
+ }
115
+
116
+ .kg-signup-card h2 + h3.kg-signup-card-subheading {
117
+ margin: 0.35em 0 0;
118
+ }
119
+
120
+ .kg-signup-card h3.kg-signup-card-subheading strong {
121
+ font-weight: 600;
122
+ }
123
+
124
+ .kg-signup-card.kg-width-wide h3.kg-signup-card-subheading {
125
+ font-size: 1.5em;
126
+ }
127
+
128
+ .kg-signup-card.kg-width-full h3.kg-signup-card-subheading {
129
+ font-size: 1.75em;
130
+ }
131
+
132
+ .kg-signup-card.kg-width-full.kg-layout-split h3.kg-signup-card-subheading {
133
+ font-size: 1.5em;
134
+ }
135
+
136
+ /* Subscribe form */
137
+
138
+ .kg-signup-card-form {
139
+ position: relative;
140
+ width: 100%;
141
+ }
142
+
143
+ .kg-signup-card-heading + .kg-signup-card-form,
144
+ .kg-signup-card-subheading + .kg-signup-card-form {
145
+ margin: 2.4vmax 0 0;
146
+ }
147
+
148
+ .kg-width-wide .kg-signup-card-heading + .kg-signup-card-form,
149
+ .kg-width-wide .kg-signup-card-subheading + .kg-signup-card-form {
150
+ margin: 3.2vmax 0 0;
151
+ }
152
+
153
+ .kg-width-full .kg-signup-card-heading + .kg-signup-card-form,
154
+ .kg-width-full .kg-signup-card-subheading + .kg-signup-card-form {
155
+ margin: 4vmax 0 0;
156
+ }
157
+
158
+ .kg-signup-card-fields {
159
+ display: flex;
160
+ }
161
+
162
+ .align-center .kg-signup-card-fields {
163
+ justify-content: center;
164
+ }
165
+
166
+ .kg-signup-card-input {
167
+ width: 100%;
168
+ border: solid 1px;
169
+ padding: 12px 16px;
170
+ font-size: 1.1em;
171
+ }
172
+
173
+ .kg-width-wide .kg-signup-card-input,
174
+ .kg-width-full .kg-signup-card-input:not(.kg-layout-split .kg-signup-card-input) {
175
+ max-width: 400px;
176
+ }
177
+
178
+ .kg-signup-card-input.kg-style-accent {
179
+ border-color: var(--ghost-accent-color);
180
+ }
181
+
182
+ .kg-signup-card-button {
183
+ display: flex;
184
+ position: relative;
185
+ align-items: center;
186
+ outline: none;
187
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
188
+ font-size: 1em;
189
+ font-weight: 600;
190
+ line-height: 1em;
191
+ text-align: center;
192
+ text-decoration: none;
193
+ letter-spacing: .2px;
194
+ white-space: nowrap;
195
+ text-overflow: ellipsis;
196
+ height: 3em;
197
+ padding: 0 1.2em;
198
+ transition: opacity .2s ease;
199
+ }
200
+
201
+ .kg-signup-card-button.kg-style-accent {
202
+ background-color: var(--ghost-accent-color);
203
+ }
204
+
205
+ .kg-signup-card h2 + .kg-signup-card-button,
206
+ .kg-signup-card h3 + .kg-signup-card-button {
207
+ margin: 1.5em 0 0;
208
+ }
209
+
210
+ .kg-signup-card .kg-signup-card-button:hover {
211
+ opacity: 0.85;
212
+ }
213
+
214
+ .kg-signup-card.kg-width-wide .kg-signup-card-button {
215
+ font-size: 1.05em;
216
+ }
217
+
218
+ .kg-signup-card.kg-width-wide h2 + .kg-signup-card-button,
219
+ .kg-signup-card.kg-width-wide h3 + .kg-signup-card-button {
220
+ margin-top: 1.75em;
221
+ }
222
+
223
+ .kg-signup-card.kg-width-full .kg-signup-card-button {
224
+ font-size: 1.1em;
225
+ }
226
+
227
+ .kg-signup-card.kg-width-full h2 + .kg-signup-card-button,
228
+ .kg-signup-card.kg-width-full h3 + .kg-signup-card-button {
229
+ margin-top: 2em;
230
+ }
231
+
232
+ /* Subscribe form states */
233
+
234
+ .kg-signup-card-success,
235
+ .kg-signup-card-error {
236
+ display: none;
237
+ }
238
+
239
+ .kg-signup-card-form.success .kg-signup-card-fields {
240
+ display: none;
241
+ }
242
+
243
+ .kg-signup-card-form.success .kg-signup-card-success {
244
+ display: flex;
245
+ align-items: center;
246
+ height: 3em;
247
+ font-size: 1.25em;
248
+ font-weight: 500;
249
+ line-height: 1.4em;
250
+ }
251
+
252
+ .kg-signup-card-form.error .kg-signup-card-error {
253
+ display: block;
254
+ position: absolute;
255
+ top: -32px;
256
+ }
257
+
258
+ .kg-signup-card-button-loading {
259
+ position: absolute;
260
+ inset: 0;
261
+ align-items: center;
262
+ justify-content: center;
263
+ display: none;
264
+ }
265
+
266
+ .kg-signup-card-form.loading .kg-signup-card-button-loading {
267
+ display: flex;
268
+ }
269
+
270
+ /* Disclaimer */
271
+
272
+ .kg-signup-card-disclaimer {
273
+ margin: 1rem 0 0;
274
+ }
275
+
276
+ .kg-signup-card-form.success + .kg-signup-card-disclaimer {
277
+ visibility: hidden;
278
+ }
279
+
280
+
281
+ /* Responsive styles */
282
+
283
+ @media (max-width: 640px) {
284
+ .kg-signup-card.kg-layout-split {
285
+ grid-template-columns: 1fr;
286
+ }
287
+
288
+ .kg-width-wide .kg-signup-card-container {
289
+ padding: 6.4vmax 4vmax;
290
+ }
291
+
292
+ .kg-width-full .kg-signup-card-container {
293
+ padding: 9.6vmax 4vmax;
294
+ }
295
+
296
+ .kg-signup-card-image {
297
+ height: auto;
298
+ min-height: unset;
299
+ aspect-ratio: 1 / 1;
300
+ }
301
+
302
+ .kg-signup-card-input {
303
+ font-size: inherit;
304
+ }
305
+ .kg-signup-card.kg-width-wide .kg-signup-card-button,
306
+ .kg-signup-card.kg-width-full .kg-signup-card-button {
307
+ font-size: 1em;
308
+ }
309
+
310
+ .kg-signup-card h3.kg-signup-card-subheading,
311
+ .kg-signup-card.kg-width-wide h3.kg-signup-card-subheading,
312
+ .kg-signup-card.kg-width-full h3.kg-signup-card-subheading,
313
+ .kg-signup-card.kg-width-full.kg-layout-split h3.kg-signup-card-subheading {
314
+ font-size: 1.1em;
315
+ }
316
+ }
@@ -0,0 +1,115 @@
1
+ const errors = require('@tryghost/errors');
2
+ const tpl = require('@tryghost/tpl');
3
+ const collectionsService = require('../../services/collections');
4
+
5
+ const messages = {
6
+ collectionNotFound: 'Collection not found.'
7
+ };
8
+
9
+ module.exports = {
10
+ docName: 'collections',
11
+
12
+ browse: {
13
+ options: [
14
+ 'limit',
15
+ 'order',
16
+ 'page'
17
+ ],
18
+ // @NOTE: should have permissions when moving out of Alpha
19
+ permissions: false,
20
+ query(frame) {
21
+ return collectionsService.api.browse(frame.options);
22
+ }
23
+ },
24
+
25
+ read: {
26
+ data: [
27
+ 'id'
28
+ ],
29
+ // @NOTE: should have permissions when moving out of Alpha
30
+ permissions: false,
31
+ async query(frame) {
32
+ const model = await collectionsService.api.read(frame.data.id, frame.options);
33
+
34
+ if (!model) {
35
+ throw new errors.NotFoundError({
36
+ message: tpl(messages.collectionNotFound)
37
+ });
38
+ }
39
+
40
+ return model;
41
+ }
42
+ },
43
+
44
+ add: {
45
+ statusCode: 201,
46
+ headers: {
47
+ cacheInvalidate: true
48
+ },
49
+ // @NOTE: should have permissions when moving out of Alpha
50
+ permissions: false,
51
+ async query(frame) {
52
+ return await collectionsService.api.add(frame.data.collections[0], frame.options);
53
+ }
54
+ },
55
+
56
+ edit: {
57
+ headers: {},
58
+ options: [
59
+ 'id'
60
+ ],
61
+ validation: {
62
+ options: {
63
+ id: {
64
+ required: true
65
+ }
66
+ }
67
+ },
68
+ // @NOTE: should have permissions when moving out of Alpha
69
+ permissions: false,
70
+ async query(frame) {
71
+ const model = await collectionsService.api.edit(Object.assign(frame.data.collections[0], {
72
+ id: frame.options.id
73
+ }), frame.options);
74
+
75
+ if (!model) {
76
+ throw new errors.NotFoundError({
77
+ message: tpl(messages.collectionNotFound)
78
+ });
79
+ }
80
+
81
+ // @NOTE: cache invalidation has to be done manually for now
82
+ // because the model's wasChanged is not returned from
83
+ // the service using in-memory repository layer
84
+ // if (model.wasChanged()) {
85
+ this.headers.cacheInvalidate = true;
86
+ // } else {
87
+ // this.headers.cacheInvalidate = false;
88
+ // }
89
+
90
+ return model;
91
+ }
92
+ },
93
+
94
+ destroy: {
95
+ statusCode: 204,
96
+ headers: {
97
+ cacheInvalidate: true
98
+ },
99
+ options: [
100
+ 'id'
101
+ ],
102
+ validation: {
103
+ options: {
104
+ id: {
105
+ required: true
106
+ }
107
+ }
108
+ },
109
+ // @NOTE: should have permissions when moving out of Alpha
110
+ permissions: false,
111
+ async query(frame) {
112
+ return await collectionsService.api.destroy(frame.options.id);
113
+ }
114
+ }
115
+ };
@@ -12,6 +12,10 @@ module.exports = {
12
12
  return apiFramework.pipeline(require('./authentication'), localUtils);
13
13
  },
14
14
 
15
+ get collections() {
16
+ return apiFramework.pipeline(require('./collections'), localUtils);
17
+ },
18
+
15
19
  get db() {
16
20
  return apiFramework.pipeline(require('./db'), localUtils);
17
21
  },
@@ -21,7 +21,8 @@ module.exports = {
21
21
  'tenor',
22
22
  'editor',
23
23
  'pintura',
24
- 'adminX'
24
+ 'adminX',
25
+ 'signupForm'
25
26
  ];
26
27
 
27
28
  frame.response = {
@@ -0,0 +1,38 @@
1
+ /**
2
+ *
3
+ * @param {import('@tryghost/collections').Collection} collection
4
+ *
5
+ * @returns {SerializedCollection}
6
+ */
7
+ const mapper = (collection) => {
8
+ const json = collection.toJSON();
9
+
10
+ const serialized = {
11
+ id: json.id,
12
+ title: json.title,
13
+ slug: json.slug,
14
+ description: json.description,
15
+ type: json.type,
16
+ filter: json.filter,
17
+ feature_image: json.featureImage,
18
+ created_at: json.createdAt.toISOString().replace(/\d{3}Z$/, '000Z'),
19
+ updated_at: json.updatedAt.toISOString().replace(/\d{3}Z$/, '000Z')
20
+ };
21
+
22
+ return serialized;
23
+ };
24
+
25
+ module.exports = mapper;
26
+
27
+ /**
28
+ * @typedef {Object} SerializedCollection
29
+ * @prop {string} id
30
+ * @prop {string} title
31
+ * @prop {string} slug
32
+ * @prop {string} description
33
+ * @prop {string} type
34
+ * @prop {string} filter
35
+ * @prop {string} feature_image
36
+ * @prop {string} created_at
37
+ * @prop {string} updated_at
38
+ */
@@ -3,6 +3,7 @@ module.exports = {
3
3
  activityFeedEvents: require('./activity-feed-events'),
4
4
  authors: require('./authors'),
5
5
  comments: require('./comments'),
6
+ collections: require('./collections'),
6
7
  emails: require('./emails'),
7
8
  emailBatches: require('./email-batches'),
8
9
  emailFailures: require('./email-failures'),
@@ -1,4 +1,4 @@
1
- const {parentPort} = require('worker_threads');
1
+ const {parentPort, workerData} = require('worker_threads');
2
2
 
3
3
  const postParentPortMessage = (message) => {
4
4
  if (parentPort) {
@@ -40,10 +40,15 @@ if (parentPort) {
40
40
 
41
41
  const settings = require('./services/settings/settings-service');
42
42
  await settings.init();
43
+
44
+ const tiers = require('./services/tiers');
45
+ await tiers.init();
43
46
  // Finished INIT
44
47
 
45
48
  await updateCheck({
46
- rethrowErrors: true
49
+ rethrowErrors: true,
50
+ forceUpdate: workerData.forceUpdate,
51
+ updateCheckUrl: workerData.updateCheckUrl
47
52
  });
48
53
 
49
54
  postParentPortMessage(`Ran update check`);
@@ -0,0 +1,22 @@
1
+ const {CollectionsService, CollectionsRepositoryInMemory} = require('@tryghost/collections');
2
+
3
+ class CollectionsServiceWrapper {
4
+ api;
5
+
6
+ constructor() {
7
+ const inMemoryCollectionsRepository = new CollectionsRepositoryInMemory();
8
+ const collectionsService = new CollectionsService({
9
+ repository: inMemoryCollectionsRepository
10
+ });
11
+
12
+ this.api = {
13
+ browse: collectionsService.getAll.bind(collectionsService),
14
+ read: collectionsService.getById.bind(collectionsService),
15
+ add: collectionsService.save.bind(collectionsService),
16
+ edit: collectionsService.edit.bind(collectionsService),
17
+ destroy: collectionsService.destroy.bind(collectionsService)
18
+ };
19
+ }
20
+ }
21
+
22
+ module.exports = new CollectionsServiceWrapper();
@@ -46,7 +46,7 @@ function checkPostAccess(post, member) {
46
46
  return BLOCK_ACCESS;
47
47
  }
48
48
  visibility = post.tiers.map((product) => {
49
- return `product:${product.slug}`;
49
+ return `product:'${product.slug}'`;
50
50
  }).join(',');
51
51
  }
52
52
 
@@ -4,7 +4,7 @@ module.exports = ({t, siteTitle, email, url, accentColor = '#15212A', siteDomain
4
4
  <head>
5
5
  <meta name="viewport" content="width=device-width">
6
6
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7
- <title>🔑 ${t('Secure sign in link for {{siteTitle}}', {siteTitle})}</title>
7
+ <title>🔑 ${t('Secure sign in link for {{siteTitle}}', {siteTitle, interpolation: {escapeValue: false}})}</title>
8
8
  <style>
9
9
  /* -------------------------------------
10
10
  RESPONSIVE AND MOBILE FRIENDLY STYLES
@@ -107,7 +107,7 @@ module.exports = ({t, siteTitle, email, url, accentColor = '#15212A', siteDomain
107
107
  <div class="content" style="box-sizing: border-box; display: block; Margin: 0 auto; max-width: 600px; padding: 30px 20px;">
108
108
 
109
109
  <!-- START CENTERED CONTAINER -->
110
- <span class="preheader" style="color: transparent; display: none; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">${t('Welcome back to {{siteTitle}}!', {siteTitle})}</span>
110
+ <span class="preheader" style="color: transparent; display: none; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">${t('Welcome back to {{siteTitle}}!', {siteTitle, interpolation: {escapeValue: false}})}</span>
111
111
  <table class="main" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; background: #ffffff; border-radius: 8px;">
112
112
 
113
113
  <!-- START MAIN CONTENT AREA -->
@@ -117,7 +117,7 @@ module.exports = ({t, siteTitle, email, url, accentColor = '#15212A', siteDomain
117
117
  <tr>
118
118
  <td style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 14px; vertical-align: top;">
119
119
  <p style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 20px; color: #15212A; font-weight: bold; line-height: 24px; margin: 0; margin-bottom: 15px;">${t('Hey there,')}</p>
120
- <p style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; color: #3A464C; font-weight: normal; margin: 0; line-height: 24px; margin-bottom: 32px;">${t('Welcome back! Use this link to securely sign in to your {{siteTitle}} account:', {siteTitle})}</p>
120
+ <p style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; color: #3A464C; font-weight: normal; margin: 0; line-height: 24px; margin-bottom: 32px;">${t('Welcome back! Use this link to securely sign in to your {{siteTitle}} account:', {siteTitle, interpolation: {escapeValue: false}})}</p>
121
121
  <table border="0" cellpadding="0" cellspacing="0" class="btn btn-primary" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; box-sizing: border-box;">
122
122
  <tbody>
123
123
  <tr>
@@ -125,7 +125,7 @@ module.exports = ({t, siteTitle, email, url, accentColor = '#15212A', siteDomain
125
125
  <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: auto;">
126
126
  <tbody>
127
127
  <tr>
128
- <td style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; vertical-align: top; background-color: ${accentColor}; border-radius: 5px; text-align: center;"> <a href="${url}" target="_blank" style="display: inline-block; color: #ffffff; background-color: ${accentColor}; border: solid 1px ${accentColor}; border-radius: 5px; box-sizing: border-box; cursor: pointer; text-decoration: none; font-size: 16px; font-weight: normal; margin: 0; padding: 9px 22px 10px; border-color: ${accentColor};">${t('Sign in to {{siteTitle}}', {siteTitle})}</a> </td>
128
+ <td style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; vertical-align: top; background-color: ${accentColor}; border-radius: 5px; text-align: center;"> <a href="${url}" target="_blank" style="display: inline-block; color: #ffffff; background-color: ${accentColor}; border: solid 1px ${accentColor}; border-radius: 5px; box-sizing: border-box; cursor: pointer; text-decoration: none; font-size: 16px; font-weight: normal; margin: 0; padding: 9px 22px 10px; border-color: ${accentColor};">${t('Sign in to {{siteTitle}}', {siteTitle, interpolation: {escapeValue: false}})}</a> </td>
129
129
  </tr>
130
130
  </tbody>
131
131
  </table>
@@ -145,7 +145,7 @@ module.exports = ({t, siteTitle, email, url, accentColor = '#15212A', siteDomain
145
145
 
146
146
  <tr>
147
147
  <td style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 14px; vertical-align: top; padding-top: 80px;">
148
- <p class="small" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; line-height: 16px; font-size: 11px; color: #738A94; font-weight: normal; margin: 0;">If you did not make this request, you can safely ignore this email.</p>
148
+ <p class="small" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; line-height: 16px; font-size: 11px; color: #738A94; font-weight: normal; margin: 0;">${t('If you did not make this request, you can safely ignore this email.')}</p>
149
149
  </td>
150
150
  </tr>
151
151
  <tr>