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
@@ -37,7 +37,9 @@ const status: false | 'outdated' | 'latest' | 'future' = (() => {
37
37
  import { dateTimeListener } from "../../../scripts/dateTimeListener.js";
38
38
  import { dateWithTimeAndZone } from "../../../scripts/dateWithTimeAndZone.js";
39
39
  import { timeAgo } from "../../../scripts/timeAgo.js";
40
- // import type { VersionCacheObject } from "studiocms:sdk/types";
40
+ import * as Effect from 'effect/Effect';
41
+ import { sdkClient } from 'studiocms:client/apiClients';
42
+ import { toast } from 'studiocms:ui/components/toaster/client';
41
43
 
42
44
  function setupVersionChecker() {
43
45
  const reloadButton = document.getElementById(
@@ -70,21 +72,34 @@ const status: false | 'outdated' | 'latest' | 'future' = (() => {
70
72
  new ModalHelper("version-modal", "version-modal-trigger");
71
73
 
72
74
  reloadButton.addEventListener("click", async () => {
73
- const response = await fetch(reloadButton.dataset.link!);
74
- if (response.ok) {
75
- const data: { success: boolean; latestVersion: { version: string; lastCacheUpdate: Date } } =
76
- await response.json();
77
-
78
- if (data.success) {
79
- latestVersionElem.textContent = `v${data.latestVersion.version}`;
80
- timeElem.dateTime = new Date(
81
- data.latestVersion.lastCacheUpdate,
82
- ).toISOString();
83
- timeElem.textContent = dateWithTimeAndZone(
84
- new Date(data.latestVersion.lastCacheUpdate),
85
- );
86
- latestUpdateCheck.textContent = `(${timeAgo(new Date(data.latestVersion.lastCacheUpdate))})`;
87
- }
75
+ reloadButton.disabled = true;
76
+
77
+ type FailureVersionResponse = {
78
+ readonly success: false;
79
+ readonly latestVersion: null;
80
+ };
81
+
82
+ const { latestVersion, success } = await Effect.orElse(
83
+ sdkClient.pipe(Effect.flatMap((client) =>
84
+ client.sdk.updateLatestVersionCache()
85
+ )),
86
+ () => Effect.succeed({ success: false, latestVersion: null } as FailureVersionResponse)
87
+ ).pipe(Effect.runPromise);
88
+
89
+ if (success) {
90
+ latestVersionElem.textContent = `v${latestVersion.version}`;
91
+ timeElem.dateTime = new Date(latestVersion.lastCacheUpdate).toISOString();
92
+ timeElem.textContent = dateWithTimeAndZone(new Date(latestVersion.lastCacheUpdate));
93
+ latestUpdateCheck.textContent = `(${timeAgo(new Date(latestVersion.lastCacheUpdate))})`;
94
+
95
+ reloadButton.disabled = false;
96
+ } else {
97
+ reloadButton.disabled = false;
98
+ toast({
99
+ title: "Failed to update version check",
100
+ description: "Please try again later.",
101
+ type: "danger",
102
+ });
88
103
  }
89
104
  });
90
105
  }
@@ -2,18 +2,20 @@
2
2
  import css from '@studiocms/ui/css/prose.css?raw';
3
3
 
4
4
  interface Props {
5
- link: string;
6
5
  changelog: string;
7
6
  }
8
7
 
9
- const { link, changelog } = Astro.props;
8
+ const { changelog } = Astro.props;
10
9
  ---
11
10
 
12
- <frame-button data-link={link} data-changelog={changelog} data-styles={css}>
11
+ <frame-button data-changelog={changelog} data-styles={css}>
13
12
  <slot />
14
13
  </frame-button>
15
14
 
16
15
  <script>
16
+ import * as Effect from 'effect/Effect';
17
+ import { sdkClient } from 'studiocms:client/apiClients';
18
+
17
19
  if (!customElements.get('frame-button')) {
18
20
 
19
21
  class FrameButton extends HTMLElement {
@@ -81,15 +83,20 @@ const { link, changelog } = Astro.props;
81
83
  });
82
84
 
83
85
  slot.addEventListener('click', async () => {
86
+ const { changelog } = await Effect.orElse(
87
+ sdkClient.pipe(Effect.flatMap((client) =>
88
+ client.sdk.fullChangelog({
89
+ payload: { currentURLOrigin: window.location.origin },
90
+ })
91
+ )),
92
+ () => Effect.succeed({
93
+ success: false,
94
+ changelog: 'Failed to load changelog. Please try again later.'
95
+ })
96
+ ).pipe(
97
+ Effect.runPromise
98
+ );
84
99
  const changelogLink = this.getAttribute('data-changelog')!;
85
- const link = this.getAttribute('data-link')!;
86
- const { changelog } = await (await fetch(link, {
87
- method: 'POST',
88
- headers: {
89
- 'Content-Type': 'application/json',
90
- },
91
- body: JSON.stringify({ currentURLOrigin: window.location.origin }),
92
- })).json();
93
100
  const styles = this.getAttribute('data-styles')!;
94
101
 
95
102
  frameContent.innerHTML = `
@@ -25,7 +25,7 @@ const lastChecked = new Date(Astro.locals.StudioCMS.latestVersion.lastCacheUpdat
25
25
 
26
26
  <h2 slot="header" class="inline-title">
27
27
  <span><t-vcm key="header-title">{t('header-title')}</t-vcm></span>
28
- <button data-link={Astro.locals.StudioCMS.routeMap.sdk.updateLatestVersionCache}
28
+ <button
29
29
  id="version-modal-reload"
30
30
  class="reload-button"
31
31
  title="Check for updates"
@@ -58,7 +58,7 @@ const lastChecked = new Date(Astro.locals.StudioCMS.latestVersion.lastCacheUpdat
58
58
  <div class="version-modal-release-notes">
59
59
  <div class="prose"><Fragment set:html={parseMarkdown(changelog)} /></div>
60
60
  <span class="release-notes-read-more">
61
- <VersionCheckChangelog changelog={studioCMSSocials.changelog} link={Astro.locals.StudioCMS.routeMap.sdk.changelog}><span class="read-more-text"><t-vcm key="full-changelog">{t('full-changelog')}</t-vcm></span></VersionCheckChangelog>
61
+ <VersionCheckChangelog changelog={studioCMSSocials.changelog}><span class="read-more-text"><t-vcm key="full-changelog">{t('full-changelog')}</t-vcm></span></VersionCheckChangelog>
62
62
  </span>
63
63
  </div>
64
64
 
@@ -11,8 +11,6 @@ interface Props {
11
11
  }
12
12
 
13
13
  const { templateKeys, templates, defaultTemplates, t } = Astro.props;
14
-
15
- const templateSaveAPIEndpoint = Astro.locals.StudioCMS.routeMap.endpointLinks.templates;
16
14
  ---
17
15
 
18
16
  <Modal id='template-editor-preview-modal' size='lg'>
@@ -44,7 +42,6 @@ const templateSaveAPIEndpoint = Astro.locals.StudioCMS.routeMap.endpointLinks.te
44
42
  data-templates={JSON.stringify(templates)}
45
43
  data-template-keys={JSON.stringify(templateKeys)}
46
44
  data-default-templates={JSON.stringify(defaultTemplates)}
47
- data-save-endpoint={templateSaveAPIEndpoint}
48
45
  ></div>
49
46
 
50
47
  <script>
@@ -83,6 +80,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
83
80
  import { $i18n, baseTranslation, updateSelectOptions } from 'studiocms:i18n/client';
84
81
  import { ModalHelper } from 'studiocms:ui/components/modal/client';
85
82
  import { toast } from 'studiocms:ui/components/toaster/client';
83
+ import { dashboardClient, dashboardSharedCatchTags } from "studiocms:client/apiClients";
84
+ import * as Effect from "effect/Effect";
86
85
  import 'ace-builds/src-noconflict/ace';
87
86
  import 'ace-builds/src-noconflict/mode-handlebars';
88
87
  import 'ace-builds/src-noconflict/theme-cloud_editor';
@@ -151,7 +150,6 @@ const defaultTemplates = JSON.parse(templateEditor.dataset.defaultTemplates || '
151
150
  string,
152
151
  string
153
152
  >;
154
- const saveEndpoint = templateEditor.dataset.saveEndpoint as string;
155
153
 
156
154
  // --- INTERNATIONALIZATION SETUP ---
157
155
  const i18n = $i18n(i18nCurrentPage, baseTranslation[i18nCurrentPage]);
@@ -243,16 +241,18 @@ async function saveTemplate(templateKey: string, content: string) {
243
241
  const allTemplates = { ...templates, [templateKey]: content };
244
242
 
245
243
  try {
246
- const response = await fetch(saveEndpoint, {
247
- method: 'POST',
248
- headers: {
249
- 'Content-Type': 'application/json',
250
- },
251
- body: JSON.stringify({ templates: allTemplates }),
252
- });
253
-
254
- if (!response.ok) {
255
- throw new Error(`${t['template-editor-save-failed']}: ${response.statusText}`);
244
+ const response = await dashboardClient.pipe(
245
+ Effect.flatMap((client) =>
246
+ client.templates.updateEmailTemplates({
247
+ payload: allTemplates,
248
+ })
249
+ ),
250
+ Effect.catchTags(dashboardSharedCatchTags),
251
+ Effect.runPromise,
252
+ );
253
+
254
+ if ('error' in response) {
255
+ throw new Error(`${t['template-editor-save-failed']}: ${response.error}`);
256
256
  }
257
257
 
258
258
  displaySuccessToastThenReload(t['template-editor-save-success']);
@@ -108,7 +108,6 @@ const tagData = tagsToTaxonomyNodes(tags);
108
108
  id="inner-sidebar-items-search"
109
109
  class="folder-tree-search-container scrollbar"
110
110
  style="display: none;"
111
- data-searchlist={Astro.locals.StudioCMS.routeMap.endpointLinks.taxonomySearch}
112
111
  data-base-category-link={Astro.locals.StudioCMS.routeMap.mainLinks.taxonomyCategories}
113
112
  data-base-tag-link={Astro.locals.StudioCMS.routeMap.mainLinks.taxonomyTags}
114
113
  >
@@ -216,8 +216,6 @@ const { name, entries } = Astro.props;
216
216
  </style>
217
217
 
218
218
  <script>
219
- import { keys } from "effect/Record";
220
-
221
219
  class DynamicKeyValuePair extends HTMLElement {
222
220
  static formAssociated = true;
223
221
  #internals: ElementInternals;
@@ -180,8 +180,10 @@ const replaceNameParam = (str: string) => str.replace('{name}', pageTitle);
180
180
  ></div>
181
181
 
182
182
  <script>
183
+ import { dashboardClient, dashboardSharedCatchTags } from 'studiocms:client/apiClients';
183
184
  import { ModalHelper } from 'studiocms:ui/components/modal/client';
184
185
  import { toast } from "studiocms:ui/components/toaster/client";
186
+ import * as Effect from "effect/Effect";
185
187
 
186
188
  function setup() {
187
189
  const modeSelectorEl = document.getElementById('current-mode-selector') as HTMLDivElement;
@@ -232,10 +234,10 @@ const replaceNameParam = (str: string) => str.replace('{name}', pageTitle);
232
234
 
233
235
  const { actionRoute, slug, confirmSlug, ...jsonData } = {
234
236
  type: type,
235
- id: formData.get('id'),
236
- actionRoute: formData.get('action-route'),
237
- slug: formData.get('slug'),
238
- confirmSlug: formData.get('confirm-slug'),
237
+ id: formData.get('id')?.toString() || '',
238
+ actionRoute: formData.get('action-route')?.toString(),
239
+ slug: formData.get('slug')?.toString(),
240
+ confirmSlug: formData.get('confirm-slug')?.toString(),
239
241
  }
240
242
 
241
243
  if (!actionRoute || typeof actionRoute !== 'string') {
@@ -288,25 +290,22 @@ const replaceNameParam = (str: string) => str.replace('{name}', pageTitle);
288
290
  id: Number.parseInt(jsonData.id, 10),
289
291
  }
290
292
 
291
- const response = await fetch(actionRoute, {
292
- method: 'DELETE',
293
- headers: {
294
- 'Content-Type': 'application/json',
295
- },
296
- body: JSON.stringify(parsedJsonData),
297
- });
293
+ const response = await dashboardClient.pipe(
294
+ Effect.flatMap((client) => client.taxonomy.taxonomyDelete({
295
+ payload: parsedJsonData,
296
+ })),
297
+ Effect.catchTags(dashboardSharedCatchTags),
298
+ Effect.runPromise
299
+ );
298
300
 
299
- if (!response.ok) {
300
- const errorData = await response.json();
301
+ if ('error' in response) {
301
302
  toast({
302
303
  title: 'Error',
303
- description: errorData.message || `Failed to delete ${type === 'categories' ? 'category' : 'tag'}.`,
304
+ description: response.error,
304
305
  type: 'danger',
305
306
  });
306
307
  return;
307
- }
308
-
309
- if (response.ok) {
308
+ } else {
310
309
  toast({
311
310
  title: 'Success',
312
311
  description: `Deleted ${type === 'categories' ? 'category' : 'tag'} successfully.`,
@@ -317,13 +316,6 @@ const replaceNameParam = (str: string) => str.replace('{name}', pageTitle);
317
316
  window.location.href = indexPage;
318
317
  return;
319
318
  }
320
-
321
- toast({
322
- title: 'Error',
323
- description: 'An unexpected error occurred during deletion.',
324
- type: 'danger',
325
- });
326
- return;
327
319
  })
328
320
  break;
329
321
  }
@@ -33,6 +33,8 @@ const t = useTranslations(lang, '@studiocms/dashboard:content-sidebar');
33
33
  baseTranslation,
34
34
  updateElmPlaceholder,
35
35
  } from "studiocms:i18n/client";
36
+ import { dashboardClient } from "studiocms:client/apiClients";
37
+ import * as Effect from "effect/Effect";
36
38
 
37
39
  const currentPage = "@studiocms/dashboard:content-sidebar";
38
40
 
@@ -53,19 +55,19 @@ const t = useTranslations(lang, '@studiocms/dashboard:content-sidebar');
53
55
  const searchOutputEl = $<HTMLDivElement>(`#${searchOutputElId}`);
54
56
 
55
57
  interface TaxonomyNode {
56
- id: number;
57
- name: string;
58
- slug: string;
59
- description: string;
60
- meta: {
58
+ readonly id: number;
59
+ readonly name: string;
60
+ readonly slug: string;
61
+ readonly description: string;
62
+ readonly meta: {
61
63
  readonly [x: string]: unknown;
62
64
  };
63
- parent: number | null | undefined;
64
- children: TaxonomyNode[];
65
- type: 'category' | 'tag';
65
+ readonly parent: number | null | undefined;
66
+ readonly children: readonly TaxonomyNode[];
67
+ readonly type: 'category' | 'tag';
66
68
  }
67
69
 
68
- type SearchList = TaxonomyNode[];
70
+ type SearchList = readonly TaxonomyNode[];
69
71
 
70
72
  function getIcons(item: TaxonomyNode) {
71
73
  switch (item.type) {
@@ -85,24 +87,18 @@ const t = useTranslations(lang, '@studiocms/dashboard:content-sidebar');
85
87
  }
86
88
  }
87
89
 
88
- async function getSearchList(searchItems: HTMLDivElement) {
89
- const response = await fetch(
90
- searchItems.dataset.searchlist as string,
91
- {
92
- method: "GET",
93
- headers: {
94
- "Content-Type": "application/json",
95
- },
96
- },
90
+ async function getSearchList(): Promise<SearchList> {
91
+ return await Effect.runPromise(
92
+ Effect.orElse(
93
+ dashboardClient.pipe(
94
+ Effect.flatMap((client) => client.taxonomy.taxonomySearch({})),
95
+ Effect.tapError(Effect.logError)
96
+ ),
97
+ () => Effect.log("Failed to fetch search list, returning empty array").pipe(
98
+ Effect.as([] as SearchList)
99
+ )
100
+ )
97
101
  );
98
-
99
- if (response.ok) {
100
- const data: SearchList = await response.json();
101
- return data;
102
- } else {
103
- console.error("Failed to fetch search list");
104
- return [];
105
- }
106
102
  }
107
103
 
108
104
  function clearSearchParams(innerSidebarItemsSearch: HTMLDivElement) {
@@ -176,7 +172,7 @@ const t = useTranslations(lang, '@studiocms/dashboard:content-sidebar');
176
172
  currentUrl.searchParams.set("search", searchTerm);
177
173
  window.history.pushState({}, "", currentUrl);
178
174
 
179
- const searchList = await getSearchList(searchItems);
175
+ const searchList = await getSearchList();
180
176
 
181
177
  const fuse = new Fuse(searchList, {
182
178
  keys: ["name", "slug"],