studiocms 0.2.0 → 0.4.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 (293) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/cli/add/index.d.ts +2 -2
  3. package/dist/cli/add/index.js +4 -3
  4. package/dist/cli/add/npm-utils.d.ts +6 -6
  5. package/dist/cli/add/tryToInstallPlugins.d.ts +1 -1
  6. package/dist/cli/add/tryToInstallPlugins.js +6 -5
  7. package/dist/cli/add/updateStudioCMSConfig.d.ts +1 -1
  8. package/dist/cli/add/updateStudioCMSConfig.js +3 -4
  9. package/dist/cli/add/validatePlugins.d.ts +1 -2
  10. package/dist/cli/add/validatePlugins.js +15 -9
  11. package/dist/cli/crypto/genJWT/index.d.ts +1 -1
  12. package/dist/cli/crypto/genJWT/index.js +8 -9
  13. package/dist/cli/crypto/index.d.ts +1 -1
  14. package/dist/cli/init/steps/env.js +14 -4
  15. package/dist/cli/init/steps/next.d.ts +1 -1
  16. package/dist/cli/init/steps/next.js +6 -5
  17. package/dist/cli/migrator/index.d.ts +1 -1
  18. package/dist/cli/migrator/index.js +2 -2
  19. package/dist/cli/users/index.d.ts +1 -1
  20. package/dist/cli/users/shared.js +2 -2
  21. package/dist/cli/users/steps/createUsers.js +7 -7
  22. package/dist/cli/users/steps/modifyUsers.js +2 -2
  23. package/dist/cli/users/steps/next.d.ts +1 -1
  24. package/dist/cli/utils/checkRequiredEnvVars.js +2 -2
  25. package/dist/cli/utils/context.d.ts +2 -4
  26. package/dist/cli/utils/context.js +1 -3
  27. package/dist/cli/utils/getCliDbClient.d.ts +1 -1
  28. package/dist/cli/utils/intro.d.ts +1 -1
  29. package/dist/cli/utils/loadConfig.d.ts +54 -49
  30. package/dist/cli/utils/loadConfig.js +5 -8
  31. package/dist/cli/utils/logger.js +3 -3
  32. package/dist/cli/utils/user-utils.d.ts +1 -1
  33. package/dist/cli/utils/user-utils.js +4 -3
  34. package/dist/client/apiClient.d.ts +4923 -0
  35. package/dist/client/apiClient.js +72 -0
  36. package/dist/config.d.ts +1734 -1
  37. package/dist/consts.d.ts +5 -5
  38. package/dist/consts.js +3 -2
  39. package/dist/db/plugins.d.ts +1 -1
  40. package/dist/db/plugins.js +5 -8
  41. package/dist/handlers/frontend/routes.d.ts +4 -18
  42. package/dist/handlers/frontend/routes.js +13 -152
  43. package/dist/handlers/frontend/types.d.ts +1 -1
  44. package/dist/handlers/frontend/utils.js +0 -18
  45. package/dist/handlers/pluginHandler.d.ts +34 -257
  46. package/dist/handlers/pluginHandler.js +92 -46
  47. package/dist/handlers/routeHandler.js +32 -11
  48. package/dist/handlers/setupDbStudio.d.ts +3 -1
  49. package/dist/handlers/setupDbStudio.js +19 -10
  50. package/dist/handlers/storage-manager/core/effectify-astro-context.d.ts +25 -0
  51. package/dist/handlers/storage-manager/core/effectify-astro-context.js +78 -0
  52. package/dist/handlers/storage-manager/no-op.d.ts +2 -2
  53. package/dist/handlers/storage-manager/no-op.js +2 -3
  54. package/dist/index.d.ts +0 -1
  55. package/dist/index.js +10 -20
  56. package/dist/integrations/robots/index.d.ts +2 -2
  57. package/dist/integrations/robots/index.js +1 -3
  58. package/dist/integrations/robots/schema.d.ts +102 -273
  59. package/dist/integrations/robots/schema.js +220 -209
  60. package/dist/plugins/analytics/assets/schemas.d.ts +14 -9
  61. package/dist/plugins/analytics/assets/schemas.js +25 -17
  62. package/dist/plugins/analytics/db-client.d.ts +1 -1
  63. package/dist/plugins/analytics/index.d.ts +823 -3
  64. package/dist/plugins/analytics/index.js +4 -5
  65. package/dist/plugins/analytics/schemas.d.ts +54 -62
  66. package/dist/plugins/analytics/schemas.js +64 -13
  67. package/dist/plugins/analytics/table.d.ts +1 -1
  68. package/dist/plugins.d.ts +0 -1
  69. package/dist/schemas/config/api.d.ts +17 -0
  70. package/dist/schemas/config/api.js +14 -0
  71. package/dist/schemas/config/auth.d.ts +55 -59
  72. package/dist/schemas/config/auth.js +34 -11
  73. package/dist/schemas/config/dashboard.d.ts +43 -79
  74. package/dist/schemas/config/dashboard.js +43 -12
  75. package/dist/schemas/config/db.d.ts +15 -17
  76. package/dist/schemas/config/db.js +13 -5
  77. package/dist/schemas/config/developer.d.ts +33 -45
  78. package/dist/schemas/config/developer.js +22 -5
  79. package/dist/schemas/config/index.d.ts +398 -521
  80. package/dist/schemas/config/index.js +115 -57
  81. package/dist/schemas/config/sdk.d.ts +50 -196
  82. package/dist/schemas/config/sdk.js +61 -73
  83. package/dist/schemas/custom.d.ts +40 -0
  84. package/dist/schemas/custom.js +41 -0
  85. package/dist/schemas/external-schemas.d.ts +171 -0
  86. package/dist/schemas/external-schemas.js +179 -0
  87. package/dist/schemas/index.d.ts +2 -0
  88. package/dist/schemas/index.js +2 -0
  89. package/dist/schemas/plugins/i18n.d.ts +59 -39
  90. package/dist/schemas/plugins/i18n.js +42 -5
  91. package/dist/schemas/plugins/index.d.ts +7126 -10296
  92. package/dist/schemas/plugins/index.js +260 -276
  93. package/dist/schemas/plugins/shared.d.ts +1293 -3718
  94. package/dist/schemas/plugins/shared.js +320 -329
  95. package/dist/test-utils.d.ts +15 -4
  96. package/dist/test-utils.js +27 -11
  97. package/dist/toolbar/db-viewer/db-shared-types.d.ts +6 -6
  98. package/dist/toolbar/db-viewer/studio/connection.d.ts +8 -4
  99. package/dist/toolbar/db-viewer/studio/connection.js +2 -28
  100. package/dist/toolbar/db-viewer/studio/env/libsql.d.ts +7 -0
  101. package/dist/toolbar/db-viewer/studio/env/libsql.js +17 -0
  102. package/dist/toolbar/db-viewer/studio/env/mysql.d.ts +7 -0
  103. package/dist/toolbar/db-viewer/studio/env/mysql.js +23 -0
  104. package/dist/toolbar/db-viewer/studio/env/postgres.d.ts +7 -0
  105. package/dist/toolbar/db-viewer/studio/env/postgres.js +23 -0
  106. package/dist/toolbar/db-viewer/studio/index.js +20 -56
  107. package/dist/toolbar/db-viewer/studio/type.d.ts +1 -2
  108. package/dist/toolbar/db-viewer/studio/virtual-connection/libsql.d.ts +3 -0
  109. package/dist/toolbar/db-viewer/studio/virtual-connection/libsql.js +24 -0
  110. package/dist/toolbar/db-viewer/studio/virtual-connection/mysql.d.ts +3 -0
  111. package/dist/toolbar/db-viewer/studio/virtual-connection/mysql.js +9 -0
  112. package/dist/toolbar/db-viewer/studio/virtual-connection/postgres.d.ts +3 -0
  113. package/dist/toolbar/db-viewer/studio/virtual-connection/postgres.js +9 -0
  114. package/dist/toolbar/db-viewer/viewer.js +20 -21
  115. package/dist/types.d.ts +30 -0
  116. package/dist/utils/effects/smtp.d.ts +1 -1
  117. package/dist/utils/lang-helper.d.ts +10 -2
  118. package/dist/virtual.d.ts +35 -28
  119. package/dist/virtuals/auth/core.d.ts +5 -5
  120. package/dist/virtuals/auth/verify-email.d.ts +6 -6
  121. package/dist/virtuals/components/Generator.astro +2 -2
  122. package/dist/virtuals/components/Renderer.astro +9 -1
  123. package/dist/virtuals/components/renderFn.d.ts +3 -1
  124. package/dist/virtuals/components/renderFn.js +18 -0
  125. package/dist/virtuals/lib/headDefaults.d.ts +4 -2
  126. package/dist/virtuals/lib/headDefaults.js +0 -2
  127. package/dist/virtuals/lib/routeMap.d.ts +0 -12
  128. package/dist/virtuals/lib/routeMap.js +2 -14
  129. package/dist/virtuals/mailer/index.d.ts +3 -3
  130. package/dist/virtuals/notifier/index.d.ts +5 -5
  131. package/dist/virtuals/plugins/dashboard-pages.d.ts +2 -64
  132. package/dist/virtuals/scripts/StorageFileBrowser.d.ts +1 -172
  133. package/dist/virtuals/scripts/StorageFileBrowser.js +216 -119
  134. package/dist/virtuals/template-engine/index.d.ts +4 -4
  135. package/frontend/components/dashboard/configuration/ConfigForm.astro +218 -110
  136. package/frontend/components/dashboard/content-mgmt/ContentSearch.astro +21 -22
  137. package/frontend/components/dashboard/content-mgmt/CreateFolder.astro +66 -54
  138. package/frontend/components/dashboard/content-mgmt/CreatePage.astro +58 -104
  139. package/frontend/components/dashboard/content-mgmt/EditFolder.astro +65 -67
  140. package/frontend/components/dashboard/content-mgmt/EditPage.astro +86 -134
  141. package/frontend/components/dashboard/content-mgmt/InnerSidebarElement.astro +0 -1
  142. package/frontend/components/dashboard/content-mgmt/PageHeader.astro +33 -52
  143. package/frontend/components/dashboard/content-mgmt/PageTypeHandler.astro +2 -2
  144. package/frontend/components/dashboard/profile/APITokens.astro +219 -158
  145. package/frontend/components/dashboard/profile/BasicInfo.astro +165 -106
  146. package/frontend/components/dashboard/profile/Notifications.astro +27 -18
  147. package/frontend/components/dashboard/profile/UpdatePassword.astro +134 -94
  148. package/frontend/components/dashboard/sidebar/VersionCheck.astro +31 -16
  149. package/frontend/components/dashboard/sidebar/VersionCheckChangelog.astro +18 -11
  150. package/frontend/components/dashboard/sidebar-modals/VersionModal.astro +2 -2
  151. package/frontend/components/dashboard/smtp-config/TemplateEditor.astro +14 -14
  152. package/frontend/components/dashboard/taxonomy/InnerSidebarElement.astro +0 -1
  153. package/frontend/components/dashboard/taxonomy/MetaContainer.astro +0 -2
  154. package/frontend/components/dashboard/taxonomy/PageHeader.astro +16 -24
  155. package/frontend/components/dashboard/taxonomy/TaxonomySearch.astro +23 -27
  156. package/frontend/components/dashboard/user-mgmt/InnerSidebarElement.astro +111 -104
  157. package/frontend/components/dashboard/user-mgmt/UserListItem.astro +9 -22
  158. package/frontend/components/dashboard/user-mgmt/UserListItems.astro +18 -0
  159. package/frontend/components/first-time-setup/snippets/{opt2-studiocms.config.diff → studiocms.config.diff} +1 -0
  160. package/frontend/components/shared/Code.astro +1 -4
  161. package/frontend/components/shared/DynamicSettingsRenderer.astro +1 -1
  162. package/frontend/components/shared/SSRUser.astro +2 -4
  163. package/frontend/components/shared/foldertree/FolderTreeNode.astro +0 -6
  164. package/frontend/components/shared/storage-manager/StorageCopyOutput.astro +0 -1
  165. package/frontend/components/shared/taxonomy/TaxonomyTreeNode.astro +0 -6
  166. package/frontend/layouts/DashboardLayout.astro +1 -10
  167. package/frontend/layouts/TaxonomyLayout.astro +0 -1
  168. package/frontend/middleware/index.ts +102 -61
  169. package/frontend/pages/404.astro +5 -9
  170. package/frontend/pages/[dashboard]/[...pluginPage].astro +10 -1
  171. package/frontend/pages/[dashboard]/configuration.astro +10 -1
  172. package/frontend/pages/[dashboard]/content-management/createfolder.astro +10 -1
  173. package/frontend/pages/[dashboard]/content-management/createpage.astro +10 -1
  174. package/frontend/pages/[dashboard]/content-management/diff.astro +39 -14
  175. package/frontend/pages/[dashboard]/content-management/editfolder.astro +10 -1
  176. package/frontend/pages/[dashboard]/content-management/editpage.astro +10 -1
  177. package/frontend/pages/[dashboard]/content-management/index.astro +10 -1
  178. package/frontend/pages/[dashboard]/index.astro +10 -1
  179. package/frontend/pages/[dashboard]/login.astro +86 -25
  180. package/frontend/pages/[dashboard]/password-reset.astro +22 -16
  181. package/frontend/pages/[dashboard]/plugins/[plugin].astro +10 -1
  182. package/frontend/pages/[dashboard]/profile.astro +10 -1
  183. package/frontend/pages/[dashboard]/signup.astro +153 -52
  184. package/frontend/pages/[dashboard]/smtp-configuration.astro +77 -75
  185. package/frontend/pages/[dashboard]/system-management.astro +10 -1
  186. package/frontend/pages/[dashboard]/taxonomy/categories.astro +30 -41
  187. package/frontend/pages/[dashboard]/taxonomy/index.astro +10 -0
  188. package/frontend/pages/[dashboard]/taxonomy/tags.astro +33 -43
  189. package/frontend/pages/[dashboard]/unverified-email.astro +29 -21
  190. package/frontend/pages/[dashboard]/user-management/edit.astro +170 -90
  191. package/frontend/pages/[dashboard]/user-management/index.astro +10 -1
  192. package/frontend/pages/studiocms_api/[...all].ts +106 -0
  193. package/frontend/pages/studiocms_api/_handlers/_utils/auth.ts +26 -0
  194. package/frontend/pages/studiocms_api/_handlers/_utils/changelog.ts +147 -0
  195. package/frontend/pages/studiocms_api/_handlers/_utils/db-studio-driver.ts +46 -0
  196. package/frontend/pages/studiocms_api/_handlers/_utils/parseLogLevel.ts +27 -0
  197. package/frontend/pages/studiocms_api/_handlers/auth/auth.ts +459 -0
  198. package/frontend/pages/studiocms_api/_handlers/auth/index.ts +17 -0
  199. package/frontend/pages/studiocms_api/_handlers/auth/oauth.ts +91 -0
  200. package/frontend/pages/studiocms_api/_handlers/dashboard/_shared.ts +57 -0
  201. package/frontend/pages/studiocms_api/_handlers/dashboard/apiTokens.ts +134 -0
  202. package/frontend/pages/studiocms_api/_handlers/dashboard/config.ts +64 -0
  203. package/frontend/pages/studiocms_api/_handlers/dashboard/content.ts +741 -0
  204. package/frontend/pages/studiocms_api/_handlers/dashboard/create.ts +480 -0
  205. package/frontend/pages/studiocms_api/_handlers/dashboard/emailNotifications.ts +49 -0
  206. package/frontend/pages/studiocms_api/_handlers/dashboard/index.ts +45 -0
  207. package/frontend/pages/studiocms_api/_handlers/dashboard/mailer.ts +136 -0
  208. package/frontend/pages/studiocms_api/_handlers/dashboard/plugins.ts +80 -0
  209. package/frontend/pages/studiocms_api/_handlers/dashboard/profile.ts +275 -0
  210. package/frontend/pages/studiocms_api/_handlers/dashboard/resetPassword.ts +140 -0
  211. package/frontend/pages/studiocms_api/_handlers/dashboard/search.ts +63 -0
  212. package/frontend/pages/studiocms_api/_handlers/dashboard/taxonomy.ts +285 -0
  213. package/frontend/pages/studiocms_api/_handlers/dashboard/templates.ts +75 -0
  214. package/frontend/pages/studiocms_api/_handlers/dashboard/users.ts +312 -0
  215. package/frontend/pages/studiocms_api/_handlers/dashboard/verifyEndpoints.ts +307 -0
  216. package/frontend/pages/studiocms_api/_handlers/integration/dbStudio.ts +98 -0
  217. package/frontend/pages/studiocms_api/_handlers/integration/index.ts +17 -0
  218. package/frontend/pages/studiocms_api/_handlers/integration/storageManager.ts +107 -0
  219. package/frontend/pages/studiocms_api/_handlers/rest-api/index.ts +8 -0
  220. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/_shared.ts +41 -0
  221. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/index.ts +17 -0
  222. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/public.ts +195 -0
  223. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/secure.ts +1726 -0
  224. package/frontend/pages/studiocms_api/_handlers/sdk.ts +129 -0
  225. package/frontend/pages/studiocms_api/_middleware/astroLocals.ts +36 -0
  226. package/frontend/pages/studiocms_api/_middleware/restApi.ts +56 -0
  227. package/frontend/pages/studiocms_api/integrations/[...all].ts +8 -0
  228. package/frontend/scripts/formdata.ts +219 -0
  229. package/frontend/setup-pages/3-done.astro +4 -20
  230. package/frontend/setup-pages/studiocms_api/dashboard/step-2.ts +3 -6
  231. package/frontend/styles/dashboard-base.css +0 -1
  232. package/frontend/web-vitals/endpoint.ts +2 -1
  233. package/package.json +35 -31
  234. package/dist/global.d.ts +0 -9
  235. package/frontend/components/dashboard/LoginChecker.astro +0 -68
  236. package/frontend/components/dashboard/user-mgmt/RankCheck.astro +0 -57
  237. package/frontend/components/first-time-setup/snippets/opt1-astro.config.diff +0 -14
  238. package/frontend/components/first-time-setup/snippets/opt2-astro.config.diff +0 -9
  239. package/frontend/middleware/_authmap.ts +0 -63
  240. package/frontend/pages/studiocms_api/auth/[path].ts +0 -390
  241. package/frontend/pages/studiocms_api/auth/[provider]/[...id].ts +0 -64
  242. package/frontend/pages/studiocms_api/auth/[provider]/_effects/index.ts +0 -101
  243. package/frontend/pages/studiocms_api/auth/_shared.ts +0 -52
  244. package/frontend/pages/studiocms_api/dashboard/api-tokens.ts +0 -115
  245. package/frontend/pages/studiocms_api/dashboard/config.ts +0 -74
  246. package/frontend/pages/studiocms_api/dashboard/content/diff.ts +0 -73
  247. package/frontend/pages/studiocms_api/dashboard/content/folder.ts +0 -220
  248. package/frontend/pages/studiocms_api/dashboard/content/page.ts +0 -359
  249. package/frontend/pages/studiocms_api/dashboard/create-reset-link.ts +0 -77
  250. package/frontend/pages/studiocms_api/dashboard/create-user-invite.ts +0 -231
  251. package/frontend/pages/studiocms_api/dashboard/create-user.ts +0 -186
  252. package/frontend/pages/studiocms_api/dashboard/email-notification-settings-site.ts +0 -74
  253. package/frontend/pages/studiocms_api/dashboard/mailer/check-email.ts +0 -75
  254. package/frontend/pages/studiocms_api/dashboard/mailer/config.ts +0 -136
  255. package/frontend/pages/studiocms_api/dashboard/plugins/[plugin].ts +0 -80
  256. package/frontend/pages/studiocms_api/dashboard/profile.ts +0 -245
  257. package/frontend/pages/studiocms_api/dashboard/resend-verify-email.ts +0 -77
  258. package/frontend/pages/studiocms_api/dashboard/reset-password.ts +0 -124
  259. package/frontend/pages/studiocms_api/dashboard/search-list.ts +0 -59
  260. package/frontend/pages/studiocms_api/dashboard/taxonomy-search.ts +0 -47
  261. package/frontend/pages/studiocms_api/dashboard/taxonomy.ts +0 -230
  262. package/frontend/pages/studiocms_api/dashboard/templates.ts +0 -74
  263. package/frontend/pages/studiocms_api/dashboard/update-user-notifications.ts +0 -86
  264. package/frontend/pages/studiocms_api/dashboard/users.ts +0 -236
  265. package/frontend/pages/studiocms_api/dashboard/verify-email.ts +0 -83
  266. package/frontend/pages/studiocms_api/dashboard/verify-session.ts +0 -187
  267. package/frontend/pages/studiocms_api/integrations/[type]/[...id].ts +0 -15
  268. package/frontend/pages/studiocms_api/integrations/[type]/_routes/db-studio.ts +0 -173
  269. package/frontend/pages/studiocms_api/integrations/[type]/_routes/storage.ts +0 -88
  270. package/frontend/pages/studiocms_api/partials/editor.astro +0 -74
  271. package/frontend/pages/studiocms_api/partials/render.astro +0 -39
  272. package/frontend/pages/studiocms_api/partials/user-list-items.astro +0 -43
  273. package/frontend/pages/studiocms_api/rest/utils/auth-token.ts +0 -59
  274. package/frontend/pages/studiocms_api/rest/v1/[type]/[...id].ts +0 -23
  275. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/categories.ts +0 -267
  276. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/folders.ts +0 -283
  277. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/pages.ts +0 -505
  278. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/settings.ts +0 -100
  279. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/tags.ts +0 -229
  280. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/users.ts +0 -553
  281. package/frontend/pages/studiocms_api/rest/v1/public/[type]/[...id].ts +0 -19
  282. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/categories.ts +0 -74
  283. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/folders.ts +0 -85
  284. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/pages.ts +0 -103
  285. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/tags.ts +0 -67
  286. package/frontend/pages/studiocms_api/sdk/[...path].ts +0 -97
  287. package/frontend/pages/studiocms_api/sdk/utils/changelog.ts +0 -119
  288. package/frontend/scripts/auth/formListener.ts +0 -81
  289. package/frontend/scripts/formdata-utils.ts +0 -116
  290. package/frontend/utils/build-partial-schema.ts +0 -46
  291. package/frontend/utils/errors.ts +0 -6
  292. package/frontend/utils/param-extractor.ts +0 -83
  293. package/frontend/utils/rest-router.ts +0 -444
@@ -20,7 +20,7 @@ let DemoMode: {
20
20
  enabled: false,
21
21
  };
22
22
 
23
- if (developerConfig.demoMode) {
23
+ if (typeof developerConfig.demoMode === 'object') {
24
24
  DemoMode = {
25
25
  enabled: true,
26
26
  username: developerConfig.demoMode.username,
@@ -216,13 +216,66 @@ if (usernameAndPassword && SHOW_OAUTH) {
216
216
  </script>
217
217
 
218
218
  <script>
219
- import { formListener } from '../../scripts/auth/formListener.js';
220
219
  import { ModalHelper } from 'studiocms:ui/components/modal/client';
221
220
  import { toast } from 'studiocms:ui/components/toaster/client';
221
+ import * as Effect from 'effect/Effect';
222
+ import { authClient, sharedAuthCatchTags } from 'studiocms:client/apiClients';
222
223
 
223
224
  const loginForm = document.getElementById('login-form') as HTMLFormElement | null;
224
225
  if (loginForm) {
225
- loginForm.addEventListener('submit', (event) => formListener(event, loginForm, 'login'));
226
+ loginForm.addEventListener('submit', async (event) => {
227
+ event.preventDefault();
228
+
229
+ const formData = new FormData(loginForm);
230
+
231
+ const username = formData.get('username')?.toString();
232
+ const password = formData.get('password')?.toString();
233
+
234
+ const response = await authClient.pipe(
235
+ Effect.flatMap((client) => client.auth.login({
236
+ payload: {
237
+ username: username || '',
238
+ password: password || '',
239
+ }
240
+ })),
241
+ Effect.catchTags(sharedAuthCatchTags),
242
+ Effect.catchTag('AuthAPIError', (err) => Effect.succeed({
243
+ ok: false as const,
244
+ error: {
245
+ title: err._tag,
246
+ description: err.message,
247
+ },
248
+ })),
249
+ Effect.runPromise
250
+ )
251
+
252
+ if (response.ok) {
253
+ toast({
254
+ title: 'Login successful',
255
+ description: 'Redirecting to dashboard...',
256
+ type: 'success',
257
+ })
258
+ if (typeof window !== 'undefined') {
259
+ window.location.reload();
260
+ }
261
+ return;
262
+ } else if ('error' in response) {
263
+ toast({
264
+ title: response.error.title,
265
+ description: response.error.description,
266
+ type: 'danger',
267
+ })
268
+ return;
269
+ } else {
270
+ toast({
271
+ title: 'Error',
272
+ description: 'An unknown error occurred',
273
+ type: 'danger',
274
+ })
275
+ return;
276
+ }
277
+ })
278
+
226
279
  }
227
280
 
228
281
  const forgotPasswordLink = document.getElementById('forgot-password') as HTMLDivElement;
@@ -232,35 +285,43 @@ if (usernameAndPassword && SHOW_OAUTH) {
232
285
 
233
286
  forgotPasswordModal.registerConfirmCallback(async (formData) => {
234
287
  if (!formData) return;
288
+ const email = formData.get('email')?.toString()
235
289
 
236
- const actionUrl = formData.get('action-url')?.toString() as string;
237
-
238
- const data = {
239
- email: formData.get('email')?.toString(),
240
- };
241
-
242
- const response = await fetch(actionUrl, {
243
- method: 'POST',
244
- headers: {
245
- 'Content-Type': 'application/json',
246
- },
247
- body: JSON.stringify(data),
248
- });
249
-
250
- const result = await response.json();
290
+ if (!email) {
291
+ toast({
292
+ title: 'Error',
293
+ description: 'Email is required',
294
+ type: 'danger',
295
+ })
296
+ return;
297
+ }
251
298
 
252
- if (response.ok) {
299
+ const response = await authClient.pipe(
300
+ Effect.flatMap((client) => client.auth.forgotPassword({
301
+ payload: { email },
302
+ })),
303
+ Effect.catchTags(sharedAuthCatchTags),
304
+ Effect.catchTag('AuthAPIError', (err) => Effect.succeed({
305
+ error: {
306
+ title: err._tag,
307
+ description: err.message,
308
+ },
309
+ })),
310
+ Effect.runPromise
311
+ )
312
+
313
+ if ('error' in response) {
253
314
  toast({
254
- title: 'Success',
255
- description: result.message,
256
- type: 'success',
315
+ title: response.error.title,
316
+ description: response.error.description,
317
+ type: 'danger',
257
318
  })
258
319
  return;
259
320
  } else {
260
321
  toast({
261
- title: 'Error',
262
- description: result.error || 'An error occurred',
263
- type: 'danger',
322
+ title: 'Success',
323
+ description: response.message,
324
+ type: 'success',
264
325
  })
265
326
  return;
266
327
  }
@@ -6,6 +6,7 @@ import { Button } from 'studiocms:ui/components/button';
6
6
  import { Card } from 'studiocms:ui/components/card';
7
7
  import { Icon } from 'studiocms:ui/components/icon';
8
8
  import { Input } from 'studiocms:ui/components/input';
9
+ import { setDataContext } from '@withstudiocms/effect/astro/data-middleware';
9
10
  import Layout from '../../layouts/DashboardLayout.astro';
10
11
 
11
12
  const { siteConfig: config, defaultLang: lang, security } = Astro.locals.StudioCMS;
@@ -38,12 +39,16 @@ if (!lookupToken) {
38
39
  logger.warn('Missing - token');
39
40
  return new Response(null, { status: 404 });
40
41
  }
42
+
43
+ setDataContext(Astro, {
44
+ key: 'x-required-role',
45
+ value: 'none',
46
+ });
41
47
  ---
42
48
 
43
49
  <Layout
44
50
  title={t("title")}
45
51
  description={t("description")}
46
- requiredPermission={"none"}
47
52
  sidebar={false}
48
53
  {lang}
49
54
  {config}
@@ -156,6 +161,8 @@ if (!lookupToken) {
156
161
 
157
162
  <script>
158
163
  import { toast } from "studiocms:ui/components/toaster/client";
164
+ import { dashboardClient, dashboardSharedCatchTags } from "studiocms:client/apiClients";
165
+ import * as Effect from "effect/Effect";
159
166
 
160
167
  const resetForm = document.getElementById(
161
168
  "reset-password-form",
@@ -176,28 +183,27 @@ if (!lookupToken) {
176
183
  ) as string,
177
184
  };
178
185
 
179
- const response = await fetch(resetForm.action, {
180
- method: "POST",
181
- headers: {
182
- "Content-Type": "application/json",
183
- },
184
- body: JSON.stringify(data),
185
- });
186
-
187
- const res = await response.json();
186
+ const response = await dashboardClient.pipe(
187
+ Effect.flatMap((client) =>
188
+ client.resetPassword.resetPassword({
189
+ payload: data,
190
+ })
191
+ ),
192
+ Effect.catchTags(dashboardSharedCatchTags),
193
+ Effect.runPromise
194
+ );
188
195
 
189
- if (response.status !== 200) {
196
+ if ("error" in response) {
190
197
  toast({
191
198
  title: "Error",
192
- description: res.error,
199
+ description: response.error,
193
200
  type: "danger",
194
201
  });
195
- }
196
-
197
- if (response.status === 200) {
202
+ return;
203
+ } else {
198
204
  toast({
199
205
  title: "Success",
200
- description: res.message,
206
+ description: "Your password has been reset successfully.",
201
207
  type: "success",
202
208
  });
203
209
  }
@@ -3,6 +3,7 @@ import { useTranslations } from 'studiocms:i18n';
3
3
  import pluginList from 'studiocms:plugins';
4
4
  import { Button } from 'studiocms:ui/components/button';
5
5
  import { Icon } from 'studiocms:ui/components/icon';
6
+ import { setDataContext } from '@withstudiocms/effect/astro/data-middleware';
6
7
  import PageHeader from '../../../components/dashboard/PageHeader.astro';
7
8
  import SettingsRenderer from '../../../components/dashboard/plugins/SettingsRenderer.astro';
8
9
  import Layout from '../../../layouts/DashboardLayout.astro';
@@ -26,12 +27,20 @@ const pluginData = filteredPluginList.find((p) => p.identifier === plugin);
26
27
  if (!pluginData) {
27
28
  return new Response(null, { status: 404 });
28
29
  }
30
+
31
+ setDataContext(Astro, {
32
+ key: 'x-required-role',
33
+ value: 'editor',
34
+ });
35
+ setDataContext(Astro, {
36
+ key: 'x-redirect-url',
37
+ value: Astro.locals.StudioCMS.routeMap.mainLinks.dashboardIndex,
38
+ });
29
39
  ---
30
40
 
31
41
  <Layout
32
42
  title={t('title')}
33
43
  description={t('description')}
34
- requiredPermission='editor'
35
44
  {lang}
36
45
  {config}
37
46
  {currentUser}
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  import { authConfig } from 'studiocms:config';
3
3
  import { useTranslations } from 'studiocms:i18n';
4
+ import { setDataContext } from '@withstudiocms/effect/astro/data-middleware';
4
5
  import PageHeader from '../../components/dashboard/PageHeader.astro';
5
6
  import APITokens from '../../components/dashboard/profile/APITokens.astro';
6
7
  import BasicInfo from '../../components/dashboard/profile/BasicInfo.astro';
@@ -23,12 +24,20 @@ const {
23
24
  const shouldShowOAuth = showOAuth && providerData.some(({ enabled }) => enabled);
24
25
 
25
26
  const isAllowedAPITokens = Astro.locals.StudioCMS.security?.userPermissionLevel.isEditor ?? false;
27
+
28
+ setDataContext(Astro, {
29
+ key: 'x-required-role',
30
+ value: 'visitor',
31
+ });
32
+ setDataContext(Astro, {
33
+ key: 'x-redirect-url',
34
+ value: Astro.locals.StudioCMS.routeMap.authLinks.logoutURL,
35
+ });
26
36
  ---
27
37
 
28
38
  <Layout
29
39
  title={t('title')}
30
40
  description={t('description')}
31
- requiredPermission="visitor"
32
41
  {lang}
33
42
  {config}
34
43
  {currentUser}
@@ -34,54 +34,81 @@ if (usernameAndPassword && SHOW_OAUTH) {
34
34
  paragraph = 'sub-header-noprovider';
35
35
  }
36
36
  ---
37
- <AuthLayout
38
- title={t('title')}
39
- description={t('description')}
40
- {lang}
41
- checkLogin
42
- >
43
-
37
+
38
+ <AuthLayout title={t("title")} description={t("description")} {lang} checkLogin>
44
39
  <div slot="header" class="form-header">
45
40
  <h1>
46
- <t-signup key="header">{t('header')}</t-signup>
41
+ <t-signup key="header">{t("header")}</t-signup>
47
42
  </h1>
48
43
  <p>
49
44
  <t-signup key={paragraph}>{t(paragraph)}</t-signup>
50
45
  </p>
51
46
  </div>
52
47
 
53
- { usernameAndPassword && (
54
- <form class="form" id="sign-up-form" method="post" action={Astro.locals.StudioCMS.routeMap.authLinks.registerAPI}>
55
-
56
- <Input label={t('username-label')} name="username" type="text" />
57
- <Input label={t('email-label')} name="email" type="email" />
58
- <Input label={t('displayname-label')} name="displayname" type="text" />
59
- <Input label={t('password-label')} name="password" type="password" />
60
- <Input label={t('confirm-password-label')} name="confirm-password" type="password" />
61
-
62
- <Button fullWidth type="submit" as="button" type="submit" color='primary' variant='solid'>
63
- <t-signup key="create-account-button">{t('create-account-button')}</t-signup>
64
- </Button>
65
- </form>
66
- )}
67
-
68
- { allowUserRegistration && (
69
- <p slot="footer">
70
- <t-signup key="allow-login-haveaccount">
71
- {t('allow-login-haveaccount')}
72
- </t-signup>
73
- <a href={Astro.locals.StudioCMS.routeMap.authLinks.loginURL}>
74
- <t-signup key="allow-login-login">
75
- {t('allow-login-login')}
76
- </t-signup>
77
- </a>
78
- </p>
79
- )}
48
+ {
49
+ usernameAndPassword && (
50
+ <form
51
+ class="form"
52
+ id="sign-up-form"
53
+ method="post"
54
+ action={Astro.locals.StudioCMS.routeMap.authLinks.registerAPI}
55
+ >
56
+ <Input
57
+ label={t("username-label")}
58
+ name="username"
59
+ type="text"
60
+ />
61
+ <Input label={t("email-label")} name="email" type="email" />
62
+ <Input
63
+ label={t("displayname-label")}
64
+ name="displayname"
65
+ type="text"
66
+ />
67
+ <Input
68
+ label={t("password-label")}
69
+ name="password"
70
+ type="password"
71
+ />
72
+ <Input
73
+ label={t("confirm-password-label")}
74
+ name="confirm-password"
75
+ type="password"
76
+ />
77
+
78
+ <Button
79
+ fullWidth
80
+ type="submit"
81
+ as="button"
82
+ type="submit"
83
+ color="primary"
84
+ variant="solid"
85
+ >
86
+ <t-signup key="create-account-button">
87
+ {t("create-account-button")}
88
+ </t-signup>
89
+ </Button>
90
+ </form>
91
+ )
92
+ }
80
93
 
94
+ {
95
+ allowUserRegistration && (
96
+ <p slot="footer">
97
+ <t-signup key="allow-login-haveaccount">
98
+ {t("allow-login-haveaccount")}
99
+ </t-signup>
100
+ <a href={Astro.locals.StudioCMS.routeMap.authLinks.loginURL}>
101
+ <t-signup key="allow-login-login">
102
+ {t("allow-login-login")}
103
+ </t-signup>
104
+ </a>
105
+ </p>
106
+ )
107
+ }
81
108
  </AuthLayout>
82
109
 
83
110
  <script>
84
- import {
111
+ import {
85
112
  $i18n,
86
113
  $localeSettings,
87
114
  baseTranslation,
@@ -89,9 +116,9 @@ if (usernameAndPassword && SHOW_OAUTH) {
89
116
  documentUpdater,
90
117
  makeTranslation,
91
118
  updateElmLabel,
92
- } from 'studiocms:i18n/client';
119
+ } from "studiocms:i18n/client";
93
120
 
94
- const currentPage = '@studiocms/auth:signup';
121
+ const currentPage = "@studiocms/auth:signup";
95
122
 
96
123
  let lang = defaultLang;
97
124
 
@@ -100,24 +127,98 @@ if (usernameAndPassword && SHOW_OAUTH) {
100
127
  $localeSettings.subscribe((locale) => {
101
128
  lang = locale || defaultLang;
102
129
  });
103
-
104
- i18n.subscribe(comp => {
105
- documentUpdater(comp, lang)
106
- updateElmLabel('username', comp['username-label']);
107
- updateElmLabel('email', comp['email-label']);
108
- updateElmLabel('displayname', comp['displayname-label']);
109
- updateElmLabel('password', comp['password-label']);
110
- updateElmLabel('confirm-password', comp['confirm-password-label']);
130
+
131
+ i18n.subscribe((comp) => {
132
+ documentUpdater(comp, lang);
133
+ updateElmLabel("username", comp["username-label"]);
134
+ updateElmLabel("email", comp["email-label"]);
135
+ updateElmLabel("displayname", comp["displayname-label"]);
136
+ updateElmLabel("password", comp["password-label"]);
137
+ updateElmLabel("confirm-password", comp["confirm-password-label"]);
111
138
  });
112
139
 
113
- if (!customElements.get('t-signup')) {
114
- customElements.define('t-signup', makeTranslation(currentPage, i18n));
140
+ if (!customElements.get("t-signup")) {
141
+ customElements.define("t-signup", makeTranslation(currentPage, i18n));
115
142
  }
116
143
  </script>
117
144
 
118
145
  <script>
119
- import { formListener } from '../../scripts/auth/formListener.js';
120
- const signUpForm = document.getElementById('sign-up-form') as HTMLFormElement;
121
-
122
- signUpForm.addEventListener('submit', async (event) => formListener(event, signUpForm, 'register'));
146
+ import { toast } from "studiocms:ui/components/toaster/client";
147
+ import * as Effect from "effect/Effect";
148
+ import { authClient, sharedAuthCatchTags } from "studiocms:client/apiClients";
149
+
150
+ const signUpForm = document.getElementById(
151
+ "sign-up-form",
152
+ ) as HTMLFormElement | null;
153
+
154
+ signUpForm?.addEventListener("submit", async (event) => {
155
+ event.preventDefault();
156
+
157
+ const formData = new FormData(signUpForm);
158
+
159
+ const username = formData.get("username") as string;
160
+ const email = formData.get("email") as string;
161
+ const displayname = formData.get("displayname") as string;
162
+ const password = formData.get("password") as string;
163
+ const confirmPassword = formData.get("confirm-password") as string;
164
+
165
+ if (password !== confirmPassword) {
166
+ toast({
167
+ title: "Error",
168
+ description: "Passwords do not match",
169
+ type: "danger",
170
+ });
171
+ return;
172
+ }
173
+
174
+ const response = await authClient.pipe(
175
+ Effect.flatMap((client) =>
176
+ client.auth.register({
177
+ payload: {
178
+ username,
179
+ displayname,
180
+ email,
181
+ password
182
+ },
183
+ }),
184
+ ),
185
+ Effect.catchTags(sharedAuthCatchTags),
186
+ Effect.catchTag("AuthAPIError", (err) =>
187
+ Effect.succeed({
188
+ ok: false as const,
189
+ error: {
190
+ title: err._tag,
191
+ description: err.message,
192
+ },
193
+ }),
194
+ ),
195
+ Effect.runPromise,
196
+ );
197
+
198
+ if (response.ok) {
199
+ toast({
200
+ title: "Registration successful",
201
+ description: "Redirecting...",
202
+ type: "success",
203
+ });
204
+ if (typeof window !== "undefined") {
205
+ window.location.reload();
206
+ }
207
+ return;
208
+ } else if ("error" in response) {
209
+ toast({
210
+ title: response.error.title,
211
+ description: response.error.description,
212
+ type: "danger",
213
+ });
214
+ return;
215
+ } else {
216
+ toast({
217
+ title: "Error",
218
+ description: "An unknown error occurred",
219
+ type: "danger",
220
+ });
221
+ return;
222
+ }
223
+ });
123
224
  </script>